BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
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 if (i != row) {
10 colCount = 0;
11 for (int j = 0; j < order; j++) {
12 // when j is not the element
13 if (j != col) {
14 dest[rowCount][colCount] = src[i][j];
15 colCount++;
16 }
17 }
18 rowCount++;
19 }
20 }
21
22 return 1;
23}
24
25// Calculate the determinant recursively.
26std::complex<float> CalcDeterminant(std::complex<float>** mat, int order)
27{
28 // order must be >= 0
29 // stop the recursion when matrix is a single element
30 if (order == 1)
31 return mat[0][0];
32
33 // the determinant value
34 std::complex<float> det = 0;
35
36 // allocate the cofactor matrix
37 std::complex<float>** minor;
38 minor = new std::complex<float>*[order - 1];
39 for (int i = 0; i < order - 1; i++)
40 minor[i] = new std::complex<float>[order - 1];
41
42 for (int i = 0; i < order; i++) {
43 // get minor of element (0,i)
44 GetMinor(mat, minor, 0, i, order);
45 // the recusion is here!
46
47 std::complex<float> neg = {-1.0, -1.0};
48 std::complex<float> pos = {1.0, 1.0};
49 std::complex<float> sign = (i % 2 == 1) ? neg : pos;
50 det += sign * mat[0][i] * CalcDeterminant(minor, order - 1);
51 // det += pow( -1.0, i ) * mat[0][i] * CalcDeterminant( minor,order-1 );
52 }
53
54 // release memory
55 for (int i = 0; i < order - 1; i++)
56 delete[] minor[i];
57 delete[] minor;
58
59 return det;
60}
61
62// matrix inversioon
63// the result is put in Y
64void MatrixInversion(std::complex<float>** A, int order, std::complex<float>** Y)
65{
66 // get the determinant of a
67 std::complex<float> unit = {1.0, 1.0};
68 std::complex<float> det = unit / CalcDeterminant(A, order);
69
70 // memory allocation
71 std::complex<float>* temp = new std::complex<float>[(order - 1) * (order - 1)];
72 std::complex<float>** minor = new std::complex<float>*[order - 1];
73 for (int i = 0; i < order - 1; i++)
74 minor[i] = temp + (i * (order - 1));
75
76 for (int j = 0; j < order; j++) {
77 for (int i = 0; i < order; i++) {
78 // get the co-factor (matrix) of A(j,i)
79 GetMinor(A, minor, j, i, order);
80 Y[i][j] = det * CalcDeterminant(minor, order - 1);
81 if ((i + j) % 2 == 1)
82 Y[i][j] = -Y[i][j];
83 }
84 }
85
86 // release memory
87 // delete [] minor[0];
88 delete[] temp;
89 delete[] minor;
90}
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