13 void lubksb( float **a, int n, int *indx, float b[] ){
14 // Solves the set of n linear equations A.X=B. Here a[n][n] is input, not as the matrix
15 // A but rather as its LU decomposition determined by the routine ludcmp. indx[n] is input
16 // as the permutation vector returned by ludcmp. b[n] is input as the right-hand side vector
17 // B, and returns with the solution vector X. a, n and indx are not modified by this routine
18 // and can be left in place for successive calls with different right-hand sides b. This routine takes
19 // into account the possibility that b will begin with many zero elements, so it is efficient for use
20 // in matrix inversion
24 for ( i = 0; i < n; i++ ) {
29 for ( j = ii; j < i; j++ ) sum -= a[i][j] * b[j];
36 for ( i = n - 1; i >= 0; i-- ) {
38 for ( j = i + 1; j < n; j++ ) sum -= a[i][j] * b[j];
42 /* (C) Copr. 1986-92 Numerical Recipes Software */
45 int ludcmp( float **a, int n, int *indx, float *d ){
46 // given a matrix a[n][n] this routine replaces it with the LU decomposition of a rowwise
47 // permutation of itself. a and n are input. a is output, arranged as in above equation;
48 // indx[n] is an output vector that records the row permutation effected by the partial
49 // pivoting; d is output as +/-1 depending on whether the number of row interchanges was even
50 // or odd, respectively. This routine is used in combination with lubksb to solve linear
51 // equations or invert a matrix.
53 float big,dum,sum,temp;
57 vv = (float*)malloc( sizeof( float ) * n );
59 for ( i = 0; i < n; i++ ) {
61 for ( j = 0; j < n; j++ )
62 if ( ( temp = (float)fabs( a[i][j] ) ) > big ) {
70 for ( j = 0; j < n; j++ ) {
71 for ( i = 0; i < j; i++ ) {
73 for ( k = 0; k < i; k++ ) sum -= a[i][k] * a[k][j];
77 for ( i = j; i < n; i++ ) {
79 for ( k = 0; k < j; k++ )
80 sum -= a[i][k] * a[k][j];
82 if ( ( dum = vv[i] * (float)fabs( sum ) ) >= big ) {
88 for ( k = 0; k < n; k++ ) {
97 if ( a[j][j] == 0.0 ) {
101 dum = 1.0f / ( a[j][j] );
102 for ( i = j + 1; i < n; i++ ) a[i][j] *= dum;
108 /* (C) Copr. 1986-92 Numerical Recipes Software */