00001 #include "sadie.h"
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 void MATRIX_INVERT (
00013 double *mat,
00014 short size,
00015 double *inv
00016
00017 ) { register short i, j, k;
00018 double temp;
00019
00020 if (TIMES) TIMING(T_MATRIX_INVERT);
00021
00022
00023 for (i=0; i<size; i++) {
00024 for (j=0; j<size; j++) {
00025 inv[i*size+j] = mat[i*size+j];
00026 }
00027 }
00028
00029
00030 for (i=0; i<size; i++) {
00031 temp = inv[i*size+i];
00032 inv[i*size+i] = 1.0;
00033 for (j=0; j<size; j++) {
00034 if (temp == 0.0) {
00035 MESSAGE('E'," Can't invert singular matrix.");
00036 goto the_end;
00037 } else {
00038 inv[i*size+j] /= temp;
00039 }
00040 }
00041 for (j=0; j<size; j++) {
00042 if (j != i) {
00043 temp = inv[j*size+i];
00044 inv[j*size+i] = 0.0;
00045 for (k=0; k<size; k++) {
00046 inv[j*size+k] -= temp*inv[i*size+k];
00047 }
00048 }
00049 }
00050 }
00051
00052 the_end:
00053 if (TIMES) TIMING(T_EXIT);
00054 }