VIRCAM Pipeline  1.3.4
solve.c
1 /*
2 
3 $Id: solve.c,v 1.1 2005-09-13 13:25:31 jim Exp $
4 
5 */
6 #include <stdio.h>
7 #include <stdlib.h>
8 
9 #include "imcore.h"
10 #include "floatmath.h"
11 #include "util.h"
12 
13 /* gauss elimination to solve ax=b */
14 
15 void solve (double a[25][25], double b[25], int m) {
16  double temp, big, pivot, rmax;
17  int i, iu, j, k, l = 0, jl, ib, ir;
18 
19  iu = m-1;
20  for(i = 0; i < iu; i++) {
21  big = 0.0;
22 
23  /* find largest remaining term in ith column for pivot */
24  for(k = i; k < m; k++) {
25  rmax = fabs(a[i][k]);
26  if(rmax > big) {
27  big = rmax;
28  l = k;
29  }
30  }
31 
32  /* check for non-zero term */
33  if(big == 0.0) {
34  for(ib = 0; ib < m; ib++) b[ib] = 0.0;
35 /* fprintf(stderr, "solve: Zero determinant\n"); */
36  return;
37  }
38 
39  if(i != l) {
40  /* switch rows */
41  for(j = 0; j < m; j++) {
42  temp = a[j][i];
43  a[j][i] = a[j][l];
44  a[j][l] = temp;
45  }
46  temp = b[i];
47  b[i] = b[l];
48  b[l] = temp;
49  }
50 
51  /* pivotal reduction */
52  pivot = a[i][i];
53  jl = i+1;
54 
55  for(j = jl; j < m; j++) {
56  temp = a[i][j]/pivot;
57  b[j] -= temp*b[i];
58  for(k = i; k < m; k++) a[k][j] -= temp*a[k][i];
59  }
60  }
61 
62  /* back substitution for solution */
63  for(i = 0; i < m; i++) {
64  ir = m-1-i;
65  if(a[ir][ir] != 0.0) {
66  temp = b[ir];
67  if(ir != m-1) {
68  for(j = 1; j <= i; j++) {
69  k = m-j;
70  temp -= a[k][ir]*b[k];
71  }
72  }
73  b[ir] = temp/a[ir][ir];
74  }
75  else
76  b[ir] = 0.0;
77  }
78 }
79 
80 /*
81 
82 $Log: not supported by cvs2svn $
83 
84 */