BmnRoot
26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Toggle main menu visibility
Loading...
Searching...
No Matches
MatrixInversion.h
Go to the documentation of this file.
1
2
// calculate the cofactor of element (row,col)
3
int
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.
26
std::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
64
void
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
}
CalcDeterminant
std::complex< float > CalcDeterminant(std::complex< float > **mat, int order)
Definition
MatrixInversion.h:26
GetMinor
int GetMinor(std::complex< float > **src, std::complex< float > **dest, int row, int col, int order)
Definition
MatrixInversion.h:3
MatrixInversion
void MatrixInversion(std::complex< float > **A, int order, std::complex< float > **Y)
Definition
MatrixInversion.h:64
i
int i
Definition
P4_F32vec4.h:22
decoder
MatrixInversion.h
Generated on
for BmnRoot by
1.17.0