BmnRoot
Loading...
Searching...
No Matches
MatrixInversion.h
Go to the documentation of this file.
1
2// calculate the cofactor of element (row,col)
3int GetMinor(std::complex<float> **src, std::complex<float> **dest, int row, int col, int order)
4{
5 // indicate which col and row is being copied to dest
6 int colCount=0,rowCount=0;
7
8 for(int i = 0; i < order; i++ )
9 {
10 if( i != row )
11 {
12 colCount = 0;
13 for(int j = 0; j < order; j++ )
14 {
15 // when j is not the element
16 if( j != col )
17 {
18 dest[rowCount][colCount] = src[i][j];
19 colCount++;
20 }
21 }
22 rowCount++;
23 }
24 }
25
26 return 1;
27}
28
29// Calculate the determinant recursively.
30std::complex<float> CalcDeterminant( std::complex<float> **mat, int order)
31{
32 // order must be >= 0
33 // stop the recursion when matrix is a single element
34 if( order == 1 )
35 return mat[0][0];
36
37 // the determinant value
38 std::complex<float> det = 0;
39
40 // allocate the cofactor matrix
41 std::complex<float> **minor;
42 minor = new std::complex<float>*[order-1];
43 for(int i=0;i<order-1;i++)
44 minor[i] = new std::complex<float>[order-1];
45
46 for(int i = 0; i < order; i++ )
47 {
48 // get minor of element (0,i)
49 GetMinor( mat, minor, 0, i , order);
50 // the recusion is here!
51
52 std::complex<float> neg = {-1.0,-1.0};
53 std::complex<float> pos = {1.0,1.0};
54 std::complex<float> sign = (i%2==1) ? neg : pos;
55 det += sign * mat[0][i] * CalcDeterminant(minor,order-1);
56 //det += pow( -1.0, i ) * mat[0][i] * CalcDeterminant( minor,order-1 );
57 }
58
59 // release memory
60 for(int i=0;i<order-1;i++)
61 delete [] minor[i];
62 delete [] minor;
63
64 return det;
65}
66
67// matrix inversioon
68// the result is put in Y
69void MatrixInversion(std::complex<float> **A, int order, std::complex<float> **Y)
70{
71 // get the determinant of a
72 std::complex<float> unit = {1.0, 1.0};
73 std::complex<float> det = unit/CalcDeterminant(A,order);
74
75 // memory allocation
76 std::complex<float> *temp = new std::complex<float>[(order-1)*(order-1)];
77 std::complex<float> **minor = new std::complex<float>*[order-1];
78 for(int i=0;i<order-1;i++)
79 minor[i] = temp+(i*(order-1));
80
81 for(int j=0;j<order;j++)
82 {
83 for(int i=0;i<order;i++)
84 {
85 // get the co-factor (matrix) of A(j,i)
86 GetMinor(A,minor,j,i,order);
87 Y[i][j] = det*CalcDeterminant(minor,order-1);
88 if( (i+j)%2 == 1)
89 Y[i][j] = -Y[i][j];
90 }
91 }
92
93 // release memory
94 //delete [] minor[0];
95 delete [] temp;
96 delete [] minor;
97}
std::complex< float > CalcDeterminant(std::complex< float > **mat, int order)
int GetMinor(std::complex< float > **src, std::complex< float > **dest, int row, int col, int order)
void MatrixInversion(std::complex< float > **A, int order, std::complex< float > **Y)
int i
Definition P4_F32vec4.h:22