11 #define TINY FLT_MIN
\r
13 void lubksb(float **a, int n, int *indx, float b[])
\r
14 // Solves the set of n linear equations A.X=B. Here a[n][n] is input, not as the matrix
\r
15 // A but rather as its LU decomposition determined by the routine ludcmp. indx[n] is input
\r
16 // as the permutation vector returned by ludcmp. b[n] is input as the right-hand side vector
\r
17 // B, and returns with the solution vector X. a, n and indx are not modified by this routine
\r
18 // and can be left in place for successive calls with different right-hand sides b. This routine takes
\r
19 // into account the possibility that b will begin with many zero elements, so it is efficient for use
\r
20 // in matrix inversion
\r
30 for (j=ii;j<i;j++) sum -= a[i][j]*b[j];
\r
34 for (i=n-1;i>=0;i--) {
\r
36 for (j=i+1;j<n;j++) sum -= a[i][j]*b[j];
\r
40 /* (C) Copr. 1986-92 Numerical Recipes Software */
\r
43 int ludcmp(float **a, int n, int *indx, float *d)
\r
44 // given a matrix a[n][n] this routine replaces it with the LU decomposition of a rowwise
\r
45 // permutation of itself. a and n are input. a is output, arranged as in above equation;
\r
46 // indx[n] is an output vector that records the row permutation effected by the partial
\r
47 // pivoting; d is output as +/-1 depending on whether the number of row interchanges was even
\r
48 // or odd, respectively. This routine is used in combination with lubksb to solve linear
\r
49 // equations or invert a matrix.
\r
52 float big,dum,sum,temp;
\r
55 vv=(float*)malloc(sizeof(float)*n);
\r
60 if ((temp=(float)fabs(a[i][j])) > big) big=temp;
\r
61 if (big == 0.0) return 1;
\r
67 for (k=0;k<i;k++) sum -= a[i][k]*a[k][j];
\r
74 sum -= a[i][k]*a[k][j];
\r
76 if ( (dum=vv[i]*(float)fabs(sum)) >= big) {
\r
91 if (a[j][j] == 0.0) a[j][j]=TINY;
\r
94 for (i=j+1;i<n;i++) a[i][j] *= dum;
\r
100 /* (C) Copr. 1986-92 Numerical Recipes Software */
\r