00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include <stdio.h>
00012 #include <math.h>
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 void ftfInvertMatrix ( int n, double *h ) {
00032 static double detm, dmax_, temp;
00033 static int i, j, k, l;
00034 static int ik[3], jk[3];
00035
00036 detm = 1.F ;
00037
00038 for (k = 0 ; k < n ; ++k) {
00039 dmax_ = (double)0.;
00040 j = -1 ;
00041 while(j < k) {
00042 i = -1 ;
00043 while(i < k) {
00044
00045 for (i = k; i < n; ++i) {
00046
00047 for (j = k; j < n; ++j) {
00048 if (fabs(dmax_) <= fabs(h[i+j*3]))
00049 {
00050 dmax_ = h[i + j * 3];
00051 ik[k] = i;
00052 jk[k] = j;
00053 }
00054 }
00055 }
00056 if (dmax_ == (double)0.) {
00057
00058 return ;
00059 }
00060 i = ik[k];
00061 }
00062 if (i > k) {
00063
00064 for (j = 0 ; j < n; ++j) {
00065 temp = h[k + j * 3];
00066 h[k + j * 3] = h[i + j * 3];
00067 h[i + j * 3] = -(double)temp;
00068 }
00069 }
00070 j = jk[k];
00071 }
00072 if (j != k) {
00073
00074 for (i = 0 ; i < n; ++i) {
00075 temp = h[i + k * 3];
00076 h[i + k * 3] = h[i + j * 3];
00077 h[i + j * 3] = -(double)temp;
00078 }
00079 }
00080
00081 for (i = 0 ; i < n; ++i) {
00082 if (i != k) {
00083 h[i + k * 3] = -(double)h[i + k * 3] / dmax_;
00084 }
00085 }
00086
00087 for (i = 0; i < n; ++i) {
00088
00089 for (j = 0; j < n; ++j) {
00090 if (i != k && j != k) {
00091 h[i + j * 3] += h[i + k * 3] * h[k + j * 3];
00092 }
00093 }
00094 }
00095 for (j = 0; j < n; ++j) {
00096 if (j != k) {
00097 h[k + j * 3] /= dmax_;
00098 }
00099 }
00100 h[k + k * 3] = 1.F / dmax_;
00101 detm *= dmax_;
00102 }
00103 for (l = 0; l < n; ++l) {
00104 k = n - l -1 ;
00105 j = ik[k];
00106 if (j > k) {
00107 for (i = 0; i < n; ++i) {
00108 temp = h[i + k * 3];
00109 h[i + k * 3] = -(double)h[i + j * 3];
00110 h[i + j * 3] = temp;
00111 }
00112 }
00113 i = jk[k];
00114 if (i > k) {
00115 for (j = 0; j < n; ++j) {
00116 temp = h[k + j * 3];
00117 h[k + j * 3] = -(double)h[i + j * 3];
00118 h[i + j * 3] = temp;
00119 }
00120 }
00121 }
00122 return ;
00123 }
00124
00125
00126
00127
00128
00129
00130 void ftfMatrixDiagonal ( double *h, double &h11, double &h22, double &h33 ){
00131 double f1, f2, f3 ;
00132
00133 f1 = h[5]*h[6]-h[8]*h[1] ;
00134 f2 = h[4]*h[8]-h[5]*h[5] ;
00135 f3 = h[8]*h[0]-h[2]*h[2] ;
00136 h11 = double(h[8] / ( f3 - f1 * f1 / f2 )) ;
00137
00138 f1 = h[2]*h[1]-h[0]*h[5] ;
00139 f2 = h[8]*h[0]-h[2]*h[2] ;
00140 f3 = h[0]*h[4]-h[1]*h[1] ;
00141 h22 = double(h[0] / ( f3 - f1 * f1 / f2 )) ;
00142
00143 f1 = h[1]*h[5]-h[4]*h[2] ;
00144 f2 = h[0]*h[4]-h[1]*h[1] ;
00145 f3 = h[4]*h[8]-h[7]*h[7] ;
00146 h33 = double(h[4] / ( f3 - f1 * f1 / f2 )) ;
00147 }