BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
BmnMatrixMath.cxx
Go to the documentation of this file.
1#include "BmnMatrixMath.h"
2
3#include <iostream>
4
5/*
6 * Matrix operations
7 */
8
9// SMij are indices for a 5x5 matrix.
10
11#define SM00 0
12#define SM01 1
13#define SM02 2
14#define SM03 3
15#define SM04 4
16
17#define SM10 1
18#define SM11 5
19#define SM12 6
20#define SM13 7
21#define SM14 8
22
23#define SM20 2
24#define SM21 6
25#define SM22 9
26#define SM23 10
27#define SM24 11
28
29#define SM30 3
30#define SM31 7
31#define SM32 10
32#define SM33 12
33#define SM34 13
34
35#define SM40 4
36#define SM41 8
37#define SM42 11
38#define SM43 13
39#define SM44 14
40
41Bool_t InvSym15(vector<Double_t>& a)
42{
43 if (a.size() != 15) {
44 cout << "-E- InvSym15: size is not correct" << endl;
45 return kFALSE;
46 }
47
48 Double_t* pM = &a[0];
49
50 // Find all NECESSARY 2x2 dets: (25 of them)
51
52 const Double_t mDet2_23_01 = pM[SM20] * pM[SM31] - pM[SM21] * pM[SM30];
53 const Double_t mDet2_23_02 = pM[SM20] * pM[SM32] - pM[SM22] * pM[SM30];
54 const Double_t mDet2_23_03 = pM[SM20] * pM[SM33] - pM[SM23] * pM[SM30];
55 const Double_t mDet2_23_12 = pM[SM21] * pM[SM32] - pM[SM22] * pM[SM31];
56 const Double_t mDet2_23_13 = pM[SM21] * pM[SM33] - pM[SM23] * pM[SM31];
57 const Double_t mDet2_23_23 = pM[SM22] * pM[SM33] - pM[SM23] * pM[SM32];
58 const Double_t mDet2_24_01 = pM[SM20] * pM[SM41] - pM[SM21] * pM[SM40];
59 const Double_t mDet2_24_02 = pM[SM20] * pM[SM42] - pM[SM22] * pM[SM40];
60 const Double_t mDet2_24_03 = pM[SM20] * pM[SM43] - pM[SM23] * pM[SM40];
61 const Double_t mDet2_24_04 = pM[SM20] * pM[SM44] - pM[SM24] * pM[SM40];
62 const Double_t mDet2_24_12 = pM[SM21] * pM[SM42] - pM[SM22] * pM[SM41];
63 const Double_t mDet2_24_13 = pM[SM21] * pM[SM43] - pM[SM23] * pM[SM41];
64 const Double_t mDet2_24_14 = pM[SM21] * pM[SM44] - pM[SM24] * pM[SM41];
65 const Double_t mDet2_24_23 = pM[SM22] * pM[SM43] - pM[SM23] * pM[SM42];
66 const Double_t mDet2_24_24 = pM[SM22] * pM[SM44] - pM[SM24] * pM[SM42];
67 const Double_t mDet2_34_01 = pM[SM30] * pM[SM41] - pM[SM31] * pM[SM40];
68 const Double_t mDet2_34_02 = pM[SM30] * pM[SM42] - pM[SM32] * pM[SM40];
69 const Double_t mDet2_34_03 = pM[SM30] * pM[SM43] - pM[SM33] * pM[SM40];
70 const Double_t mDet2_34_04 = pM[SM30] * pM[SM44] - pM[SM34] * pM[SM40];
71 const Double_t mDet2_34_12 = pM[SM31] * pM[SM42] - pM[SM32] * pM[SM41];
72 const Double_t mDet2_34_13 = pM[SM31] * pM[SM43] - pM[SM33] * pM[SM41];
73 const Double_t mDet2_34_14 = pM[SM31] * pM[SM44] - pM[SM34] * pM[SM41];
74 const Double_t mDet2_34_23 = pM[SM32] * pM[SM43] - pM[SM33] * pM[SM42];
75 const Double_t mDet2_34_24 = pM[SM32] * pM[SM44] - pM[SM34] * pM[SM42];
76 const Double_t mDet2_34_34 = pM[SM33] * pM[SM44] - pM[SM34] * pM[SM43];
77
78 // Find all NECESSARY 3x3 dets: (30 of them)
79
80 const Double_t mDet3_123_012 = pM[SM10] * mDet2_23_12 - pM[SM11] * mDet2_23_02 + pM[SM12] * mDet2_23_01;
81 const Double_t mDet3_123_013 = pM[SM10] * mDet2_23_13 - pM[SM11] * mDet2_23_03 + pM[SM13] * mDet2_23_01;
82 const Double_t mDet3_123_023 = pM[SM10] * mDet2_23_23 - pM[SM12] * mDet2_23_03 + pM[SM13] * mDet2_23_02;
83 const Double_t mDet3_123_123 = pM[SM11] * mDet2_23_23 - pM[SM12] * mDet2_23_13 + pM[SM13] * mDet2_23_12;
84 const Double_t mDet3_124_012 = pM[SM10] * mDet2_24_12 - pM[SM11] * mDet2_24_02 + pM[SM12] * mDet2_24_01;
85 const Double_t mDet3_124_013 = pM[SM10] * mDet2_24_13 - pM[SM11] * mDet2_24_03 + pM[SM13] * mDet2_24_01;
86 const Double_t mDet3_124_014 = pM[SM10] * mDet2_24_14 - pM[SM11] * mDet2_24_04 + pM[SM14] * mDet2_24_01;
87 const Double_t mDet3_124_023 = pM[SM10] * mDet2_24_23 - pM[SM12] * mDet2_24_03 + pM[SM13] * mDet2_24_02;
88 const Double_t mDet3_124_024 = pM[SM10] * mDet2_24_24 - pM[SM12] * mDet2_24_04 + pM[SM14] * mDet2_24_02;
89 const Double_t mDet3_124_123 = pM[SM11] * mDet2_24_23 - pM[SM12] * mDet2_24_13 + pM[SM13] * mDet2_24_12;
90 const Double_t mDet3_124_124 = pM[SM11] * mDet2_24_24 - pM[SM12] * mDet2_24_14 + pM[SM14] * mDet2_24_12;
91 const Double_t mDet3_134_012 = pM[SM10] * mDet2_34_12 - pM[SM11] * mDet2_34_02 + pM[SM12] * mDet2_34_01;
92 const Double_t mDet3_134_013 = pM[SM10] * mDet2_34_13 - pM[SM11] * mDet2_34_03 + pM[SM13] * mDet2_34_01;
93 const Double_t mDet3_134_014 = pM[SM10] * mDet2_34_14 - pM[SM11] * mDet2_34_04 + pM[SM14] * mDet2_34_01;
94 const Double_t mDet3_134_023 = pM[SM10] * mDet2_34_23 - pM[SM12] * mDet2_34_03 + pM[SM13] * mDet2_34_02;
95 const Double_t mDet3_134_024 = pM[SM10] * mDet2_34_24 - pM[SM12] * mDet2_34_04 + pM[SM14] * mDet2_34_02;
96 const Double_t mDet3_134_034 = pM[SM10] * mDet2_34_34 - pM[SM13] * mDet2_34_04 + pM[SM14] * mDet2_34_03;
97 const Double_t mDet3_134_123 = pM[SM11] * mDet2_34_23 - pM[SM12] * mDet2_34_13 + pM[SM13] * mDet2_34_12;
98 const Double_t mDet3_134_124 = pM[SM11] * mDet2_34_24 - pM[SM12] * mDet2_34_14 + pM[SM14] * mDet2_34_12;
99 const Double_t mDet3_134_134 = pM[SM11] * mDet2_34_34 - pM[SM13] * mDet2_34_14 + pM[SM14] * mDet2_34_13;
100 const Double_t mDet3_234_012 = pM[SM20] * mDet2_34_12 - pM[SM21] * mDet2_34_02 + pM[SM22] * mDet2_34_01;
101 const Double_t mDet3_234_013 = pM[SM20] * mDet2_34_13 - pM[SM21] * mDet2_34_03 + pM[SM23] * mDet2_34_01;
102 const Double_t mDet3_234_014 = pM[SM20] * mDet2_34_14 - pM[SM21] * mDet2_34_04 + pM[SM24] * mDet2_34_01;
103 const Double_t mDet3_234_023 = pM[SM20] * mDet2_34_23 - pM[SM22] * mDet2_34_03 + pM[SM23] * mDet2_34_02;
104 const Double_t mDet3_234_024 = pM[SM20] * mDet2_34_24 - pM[SM22] * mDet2_34_04 + pM[SM24] * mDet2_34_02;
105 const Double_t mDet3_234_034 = pM[SM20] * mDet2_34_34 - pM[SM23] * mDet2_34_04 + pM[SM24] * mDet2_34_03;
106 const Double_t mDet3_234_123 = pM[SM21] * mDet2_34_23 - pM[SM22] * mDet2_34_13 + pM[SM23] * mDet2_34_12;
107 const Double_t mDet3_234_124 = pM[SM21] * mDet2_34_24 - pM[SM22] * mDet2_34_14 + pM[SM24] * mDet2_34_12;
108 const Double_t mDet3_234_134 = pM[SM21] * mDet2_34_34 - pM[SM23] * mDet2_34_14 + pM[SM24] * mDet2_34_13;
109 const Double_t mDet3_234_234 = pM[SM22] * mDet2_34_34 - pM[SM23] * mDet2_34_24 + pM[SM24] * mDet2_34_23;
110
111 // Find all NECESSARY 4x4 dets: (15 of them)
112
113 const Double_t mDet4_0123_0123 =
114 pM[SM00] * mDet3_123_123 - pM[SM01] * mDet3_123_023 + pM[SM02] * mDet3_123_013 - pM[SM03] * mDet3_123_012;
115 const Double_t mDet4_0124_0123 =
116 pM[SM00] * mDet3_124_123 - pM[SM01] * mDet3_124_023 + pM[SM02] * mDet3_124_013 - pM[SM03] * mDet3_124_012;
117 const Double_t mDet4_0124_0124 =
118 pM[SM00] * mDet3_124_124 - pM[SM01] * mDet3_124_024 + pM[SM02] * mDet3_124_014 - pM[SM04] * mDet3_124_012;
119 const Double_t mDet4_0134_0123 =
120 pM[SM00] * mDet3_134_123 - pM[SM01] * mDet3_134_023 + pM[SM02] * mDet3_134_013 - pM[SM03] * mDet3_134_012;
121 const Double_t mDet4_0134_0124 =
122 pM[SM00] * mDet3_134_124 - pM[SM01] * mDet3_134_024 + pM[SM02] * mDet3_134_014 - pM[SM04] * mDet3_134_012;
123 const Double_t mDet4_0134_0134 =
124 pM[SM00] * mDet3_134_134 - pM[SM01] * mDet3_134_034 + pM[SM03] * mDet3_134_014 - pM[SM04] * mDet3_134_013;
125 const Double_t mDet4_0234_0123 =
126 pM[SM00] * mDet3_234_123 - pM[SM01] * mDet3_234_023 + pM[SM02] * mDet3_234_013 - pM[SM03] * mDet3_234_012;
127 const Double_t mDet4_0234_0124 =
128 pM[SM00] * mDet3_234_124 - pM[SM01] * mDet3_234_024 + pM[SM02] * mDet3_234_014 - pM[SM04] * mDet3_234_012;
129 const Double_t mDet4_0234_0134 =
130 pM[SM00] * mDet3_234_134 - pM[SM01] * mDet3_234_034 + pM[SM03] * mDet3_234_014 - pM[SM04] * mDet3_234_013;
131 const Double_t mDet4_0234_0234 =
132 pM[SM00] * mDet3_234_234 - pM[SM02] * mDet3_234_034 + pM[SM03] * mDet3_234_024 - pM[SM04] * mDet3_234_023;
133 const Double_t mDet4_1234_0123 =
134 pM[SM10] * mDet3_234_123 - pM[SM11] * mDet3_234_023 + pM[SM12] * mDet3_234_013 - pM[SM13] * mDet3_234_012;
135 const Double_t mDet4_1234_0124 =
136 pM[SM10] * mDet3_234_124 - pM[SM11] * mDet3_234_024 + pM[SM12] * mDet3_234_014 - pM[SM14] * mDet3_234_012;
137 const Double_t mDet4_1234_0134 =
138 pM[SM10] * mDet3_234_134 - pM[SM11] * mDet3_234_034 + pM[SM13] * mDet3_234_014 - pM[SM14] * mDet3_234_013;
139 const Double_t mDet4_1234_0234 =
140 pM[SM10] * mDet3_234_234 - pM[SM12] * mDet3_234_034 + pM[SM13] * mDet3_234_024 - pM[SM14] * mDet3_234_023;
141 const Double_t mDet4_1234_1234 =
142 pM[SM11] * mDet3_234_234 - pM[SM12] * mDet3_234_134 + pM[SM13] * mDet3_234_124 - pM[SM14] * mDet3_234_123;
143
144 // Find the 5x5 det:
145
146 const Double_t det = pM[SM00] * mDet4_1234_1234 - pM[SM01] * mDet4_1234_0234 + pM[SM02] * mDet4_1234_0134
147 - pM[SM03] * mDet4_1234_0124 + pM[SM04] * mDet4_1234_0123;
148
149 if (det == 0) {
150 cout << "-E- InvSym15: zero determinant" << endl;
151 return kFALSE;
152 }
153
154 const Double_t oneOverDet = 1.0 / det;
155 const Double_t mn1OverDet = -oneOverDet;
156
157 pM[SM00] = mDet4_1234_1234 * oneOverDet;
158 pM[SM01] = mDet4_1234_0234 * mn1OverDet;
159 pM[SM02] = mDet4_1234_0134 * oneOverDet;
160 pM[SM03] = mDet4_1234_0124 * mn1OverDet;
161 pM[SM04] = mDet4_1234_0123 * oneOverDet;
162
163 pM[SM11] = mDet4_0234_0234 * oneOverDet;
164 pM[SM12] = mDet4_0234_0134 * mn1OverDet;
165 pM[SM13] = mDet4_0234_0124 * oneOverDet;
166 pM[SM14] = mDet4_0234_0123 * mn1OverDet;
167
168 pM[SM22] = mDet4_0134_0134 * oneOverDet;
169 pM[SM23] = mDet4_0134_0124 * mn1OverDet;
170 pM[SM24] = mDet4_0134_0123 * oneOverDet;
171
172 pM[SM33] = mDet4_0124_0124 * oneOverDet;
173 pM[SM34] = mDet4_0124_0123 * mn1OverDet;
174
175 pM[SM44] = mDet4_0123_0123 * oneOverDet;
176
177 return kTRUE;
178}
179
180Bool_t Mult25(const vector<Double_t>& a, const vector<Double_t>& b, vector<Double_t>& c)
181{
182 if (a.size() != 25 || b.size() != 25 || c.size() != 25) {
183 cout << "-E- Mult25: size is not correct" << endl;
184 return kFALSE;
185 }
186
187 c[0] = a[0] * b[0] + a[1] * b[5] + a[2] * b[10] + a[3] * b[15] + a[4] * b[20];
188 c[1] = a[0] * b[1] + a[1] * b[6] + a[2] * b[11] + a[3] * b[16] + a[4] * b[21];
189 c[2] = a[0] * b[2] + a[1] * b[7] + a[2] * b[12] + a[3] * b[17] + a[4] * b[22];
190 c[3] = a[0] * b[3] + a[1] * b[8] + a[2] * b[13] + a[3] * b[18] + a[4] * b[23];
191 c[4] = a[0] * b[4] + a[1] * b[9] + a[2] * b[14] + a[3] * b[19] + a[4] * b[24];
192 c[5] = a[5] * b[0] + a[6] * b[5] + a[7] * b[10] + a[8] * b[15] + a[9] * b[20];
193 c[6] = a[5] * b[1] + a[6] * b[6] + a[7] * b[11] + a[8] * b[16] + a[9] * b[21];
194 c[7] = a[5] * b[2] + a[6] * b[7] + a[7] * b[12] + a[8] * b[17] + a[9] * b[22];
195 c[8] = a[5] * b[3] + a[6] * b[8] + a[7] * b[13] + a[8] * b[18] + a[9] * b[23];
196 c[9] = a[5] * b[4] + a[6] * b[9] + a[7] * b[14] + a[8] * b[19] + a[9] * b[24];
197 c[10] = a[10] * b[0] + a[11] * b[5] + a[12] * b[10] + a[13] * b[15] + a[14] * b[20];
198 c[11] = a[10] * b[1] + a[11] * b[6] + a[12] * b[11] + a[13] * b[16] + a[14] * b[21];
199 c[12] = a[10] * b[2] + a[11] * b[7] + a[12] * b[12] + a[13] * b[17] + a[14] * b[22];
200 c[13] = a[10] * b[3] + a[11] * b[8] + a[12] * b[13] + a[13] * b[18] + a[14] * b[23];
201 c[14] = a[10] * b[4] + a[11] * b[9] + a[12] * b[14] + a[13] * b[19] + a[14] * b[24];
202 c[15] = a[15] * b[0] + a[16] * b[5] + a[17] * b[10] + a[18] * b[15] + a[19] * b[20];
203 c[16] = a[15] * b[1] + a[16] * b[6] + a[17] * b[11] + a[18] * b[16] + a[19] * b[21];
204 c[17] = a[15] * b[2] + a[16] * b[7] + a[17] * b[12] + a[18] * b[17] + a[19] * b[22];
205 c[18] = a[15] * b[3] + a[16] * b[8] + a[17] * b[13] + a[18] * b[18] + a[19] * b[23];
206 c[19] = a[15] * b[4] + a[16] * b[9] + a[17] * b[14] + a[18] * b[19] + a[19] * b[24];
207 c[20] = a[20] * b[0] + a[21] * b[5] + a[22] * b[10] + a[23] * b[15] + a[24] * b[20];
208 c[21] = a[20] * b[1] + a[21] * b[6] + a[22] * b[11] + a[23] * b[16] + a[24] * b[21];
209 c[22] = a[20] * b[2] + a[21] * b[7] + a[22] * b[12] + a[23] * b[17] + a[24] * b[22];
210 c[23] = a[20] * b[3] + a[21] * b[8] + a[22] * b[13] + a[23] * b[18] + a[24] * b[23];
211 c[24] = a[20] * b[4] + a[21] * b[9] + a[22] * b[14] + a[23] * b[19] + a[24] * b[24];
212
213 return kTRUE;
214}
215
216Bool_t Transpose25(vector<Double_t>& a)
217{
218 if (a.size() != 25) {
219 cout << "-E- Transpose25: size is not correct" << endl;
220 return kTRUE;
221 }
222 vector<Double_t> b(a);
223 a[0] = b[0];
224 a[1] = b[5];
225 a[2] = b[10];
226 a[3] = b[15];
227 a[4] = b[20];
228 a[5] = b[1];
229 a[6] = b[6];
230 a[7] = b[11];
231 a[8] = b[16];
232 a[9] = b[21];
233 a[10] = b[2];
234 a[11] = b[7];
235 a[12] = b[12];
236 a[13] = b[17];
237 a[14] = b[22];
238 a[15] = b[3];
239 a[16] = b[8];
240 a[17] = b[13];
241 a[18] = b[18];
242 a[19] = b[23];
243 a[20] = b[4];
244 a[21] = b[9];
245 a[22] = b[14];
246 a[23] = b[19];
247 a[24] = b[24];
248 return kTRUE;
249}
250
251Bool_t Mult25On5(const vector<Double_t>& a, const vector<Double_t>& b, vector<Double_t>& c)
252{
253 if (a.size() != 25 || b.size() != 5 || c.size() != 5) {
254 cout << "-E- Mult25On5: size is not correct" << endl;
255 return kFALSE;
256 }
257 c[0] = a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3] + a[4] * b[4];
258 c[1] = a[5] * b[0] + a[6] * b[1] + a[7] * b[2] + a[8] * b[3] + a[9] * b[4];
259 c[2] = a[10] * b[0] + a[11] * b[1] + a[12] * b[2] + a[13] * b[3] + a[14] * b[4];
260 c[3] = a[15] * b[0] + a[16] * b[1] + a[17] * b[2] + a[18] * b[3] + a[19] * b[4];
261 c[4] = a[20] * b[0] + a[21] * b[1] + a[22] * b[2] + a[23] * b[3] + a[24] * b[4];
262 return kTRUE;
263}
264
265Bool_t Mult15On5(const vector<Double_t>& a, const vector<Double_t>& b, vector<Double_t>& c)
266{
267 if (a.size() != 15 || b.size() != 5 || c.size() != 5) {
268 cout << "-E- Mult15On5: size is not correct" << endl;
269 return kFALSE;
270 }
271 c[0] = a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3] + a[4] * b[4];
272 c[1] = a[1] * b[0] + a[5] * b[1] + a[6] * b[2] + a[7] * b[3] + a[8] * b[4];
273 c[2] = a[2] * b[0] + a[6] * b[1] + a[9] * b[2] + a[10] * b[3] + a[11] * b[4];
274 c[3] = a[3] * b[0] + a[7] * b[1] + a[10] * b[2] + a[12] * b[3] + a[13] * b[4];
275 c[4] = a[4] * b[0] + a[8] * b[1] + a[11] * b[2] + a[13] * b[3] + a[14] * b[4];
276 return kTRUE;
277}
278
279Bool_t Subtract(const vector<Double_t>& a, const vector<Double_t>& b, vector<Double_t>& c)
280{
281 if (a.size() != b.size() || a.size() != c.size()) {
282 cout << "-E- Subtract: size is not correct" << endl;
283 return kFALSE;
284 }
285 for (unsigned int i = 0; i < a.size(); ++i) {
286 c[i] = a[i] - b[i];
287 }
288 return kTRUE;
289}
290
291Bool_t Add(const vector<Double_t>& a, const vector<Double_t>& b, vector<Double_t>& c)
292{
293 if (a.size() != b.size() || a.size() != c.size()) {
294 cout << "-E- Add: size is not correct" << endl;
295 return kFALSE;
296 }
297 for (unsigned int i = 0; i < a.size(); ++i) {
298 c[i] = a[i] + b[i];
299 }
300 return kTRUE;
301}
302
303/* a*b*a^T */
304Bool_t Similarity(const vector<Double_t>& a, const vector<Double_t>& b, vector<Double_t>& c)
305{
306 if (a.size() != 25 || b.size() != 15 || c.size() != 15) {
307 cout << "-E- Similarity: size is not correct" << endl;
308 return kFALSE;
309 }
310
311 Double_t A = a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3] + a[4] * b[4];
312 Double_t B = a[0] * b[1] + a[1] * b[5] + a[2] * b[6] + a[3] * b[7] + a[4] * b[8];
313 Double_t C = a[0] * b[2] + a[1] * b[6] + a[2] * b[9] + a[3] * b[10] + a[4] * b[11];
314 Double_t D = a[0] * b[3] + a[1] * b[7] + a[2] * b[10] + a[3] * b[12] + a[4] * b[13];
315 Double_t E = a[0] * b[4] + a[1] * b[8] + a[2] * b[11] + a[3] * b[13] + a[4] * b[14];
316
317 Double_t F = a[5] * b[0] + a[6] * b[1] + a[7] * b[2] + a[8] * b[3] + a[9] * b[4];
318 Double_t G = a[5] * b[1] + a[6] * b[5] + a[7] * b[6] + a[8] * b[7] + a[9] * b[8];
319 Double_t H = a[5] * b[2] + a[6] * b[6] + a[7] * b[9] + a[8] * b[10] + a[9] * b[11];
320 Double_t I = a[5] * b[3] + a[6] * b[7] + a[7] * b[10] + a[8] * b[12] + a[9] * b[13];
321 Double_t J = a[5] * b[4] + a[6] * b[8] + a[7] * b[11] + a[8] * b[13] + a[9] * b[14];
322
323 Double_t K = a[10] * b[0] + a[11] * b[1] + a[12] * b[2] + a[13] * b[3] + a[14] * b[4];
324 Double_t L = a[10] * b[1] + a[11] * b[5] + a[12] * b[6] + a[13] * b[7] + a[14] * b[8];
325 Double_t M = a[10] * b[2] + a[11] * b[6] + a[12] * b[9] + a[13] * b[10] + a[14] * b[11];
326 Double_t N = a[10] * b[3] + a[11] * b[7] + a[12] * b[10] + a[13] * b[12] + a[14] * b[13];
327 Double_t O = a[10] * b[4] + a[11] * b[8] + a[12] * b[11] + a[13] * b[13] + a[14] * b[14];
328
329 Double_t P = a[15] * b[0] + a[16] * b[1] + a[17] * b[2] + a[18] * b[3] + a[19] * b[4];
330 Double_t Q = a[15] * b[1] + a[16] * b[5] + a[17] * b[6] + a[18] * b[7] + a[19] * b[8];
331 Double_t R = a[15] * b[2] + a[16] * b[6] + a[17] * b[9] + a[18] * b[10] + a[19] * b[11];
332 Double_t S = a[15] * b[3] + a[16] * b[7] + a[17] * b[10] + a[18] * b[12] + a[19] * b[13];
333 Double_t T = a[15] * b[4] + a[16] * b[8] + a[17] * b[11] + a[18] * b[13] + a[19] * b[14];
334
335 c[0] = A * a[0] + B * a[1] + C * a[2] + D * a[3] + E * a[4];
336 c[1] = A * a[5] + B * a[6] + C * a[7] + D * a[8] + E * a[9];
337 c[2] = A * a[10] + B * a[11] + C * a[12] + D * a[13] + E * a[14];
338 c[3] = A * a[15] + B * a[16] + C * a[17] + D * a[18] + E * a[19];
339 c[4] = A * a[20] + B * a[21] + C * a[22] + D * a[23] + E * a[24];
340
341 c[5] = F * a[5] + G * a[6] + H * a[7] + I * a[8] + J * a[9];
342 c[6] = F * a[10] + G * a[11] + H * a[12] + I * a[13] + J * a[14];
343 c[7] = F * a[15] + G * a[16] + H * a[17] + I * a[18] + J * a[19];
344 c[8] = F * a[20] + G * a[21] + H * a[22] + I * a[23] + J * a[24];
345
346 c[9] = K * a[10] + L * a[11] + M * a[12] + N * a[13] + O * a[14];
347 c[10] = K * a[15] + L * a[16] + M * a[17] + N * a[18] + O * a[19];
348 c[11] = K * a[20] + L * a[21] + M * a[22] + N * a[23] + O * a[24];
349
350 c[12] = P * a[15] + Q * a[16] + R * a[17] + S * a[18] + T * a[19];
351 c[13] = P * a[20] + Q * a[21] + R * a[22] + S * a[23] + T * a[24];
352
353 c[14] = (a[20] * b[0] + a[21] * b[1] + a[22] * b[2] + a[23] * b[3] + a[24] * b[4]) * a[20]
354 + (a[20] * b[1] + a[21] * b[5] + a[22] * b[6] + a[23] * b[7] + a[24] * b[8]) * a[21]
355 + (a[20] * b[2] + a[21] * b[6] + a[22] * b[9] + a[23] * b[10] + a[24] * b[11]) * a[22]
356 + (a[20] * b[3] + a[21] * b[7] + a[22] * b[10] + a[23] * b[12] + a[24] * b[13]) * a[23]
357 + (a[20] * b[4] + a[21] * b[8] + a[22] * b[11] + a[23] * b[13] + a[24] * b[14]) * a[24];
358 return kTRUE;
359}
360
361Bool_t Mult15On25(const vector<Double_t>& a, const vector<Double_t>& b, vector<Double_t>& c)
362{
363 if (a.size() != 15 || b.size() != 25 || c.size() != 25) {
364 cout << "-E- Mult15On25: size is not correct" << endl;
365 return kFALSE;
366 }
367 c[0] = a[0] * b[0] + a[1] * b[5] + a[2] * b[10] + a[3] * b[15] + a[4] * b[20];
368 c[1] = a[0] * b[1] + a[1] * b[6] + a[2] * b[11] + a[3] * b[16] + a[4] * b[21];
369 c[2] = a[0] * b[2] + a[1] * b[7] + a[2] * b[12] + a[3] * b[17] + a[4] * b[22];
370 c[3] = a[0] * b[3] + a[1] * b[8] + a[2] * b[13] + a[3] * b[18] + a[4] * b[23];
371 c[4] = a[0] * b[4] + a[1] * b[9] + a[2] * b[14] + a[3] * b[19] + a[4] * b[24];
372 c[5] = a[1] * b[0] + a[5] * b[5] + a[6] * b[10] + a[7] * b[15] + a[8] * b[20];
373 c[6] = a[1] * b[1] + a[5] * b[6] + a[6] * b[11] + a[7] * b[16] + a[8] * b[21];
374 c[7] = a[1] * b[2] + a[5] * b[7] + a[6] * b[12] + a[7] * b[17] + a[8] * b[22];
375 c[8] = a[1] * b[3] + a[5] * b[8] + a[6] * b[13] + a[7] * b[18] + a[8] * b[23];
376 c[9] = a[1] * b[4] + a[5] * b[9] + a[6] * b[14] + a[7] * b[19] + a[8] * b[24];
377 c[10] = a[2] * b[0] + a[6] * b[5] + a[9] * b[10] + a[10] * b[15] + a[11] * b[20];
378 c[11] = a[2] * b[1] + a[6] * b[6] + a[9] * b[11] + a[10] * b[16] + a[11] * b[21];
379 c[12] = a[2] * b[2] + a[6] * b[7] + a[9] * b[12] + a[10] * b[17] + a[11] * b[22];
380 c[13] = a[2] * b[3] + a[6] * b[8] + a[9] * b[13] + a[10] * b[18] + a[11] * b[23];
381 c[14] = a[2] * b[4] + a[6] * b[9] + a[9] * b[14] + a[10] * b[19] + a[11] * b[24];
382 c[15] = a[3] * b[0] + a[7] * b[5] + a[10] * b[10] + a[12] * b[15] + a[13] * b[20];
383 c[16] = a[3] * b[1] + a[7] * b[6] + a[10] * b[11] + a[12] * b[16] + a[13] * b[21];
384 c[17] = a[3] * b[2] + a[7] * b[7] + a[10] * b[12] + a[12] * b[17] + a[13] * b[22];
385 c[18] = a[3] * b[3] + a[7] * b[8] + a[10] * b[13] + a[12] * b[18] + a[13] * b[23];
386 c[19] = a[3] * b[4] + a[7] * b[9] + a[10] * b[14] + a[12] * b[19] + a[13] * b[24];
387 c[20] = a[4] * b[0] + a[8] * b[5] + a[11] * b[10] + a[13] * b[15] + a[14] * b[20];
388 c[21] = a[4] * b[1] + a[8] * b[6] + a[11] * b[11] + a[13] * b[16] + a[14] * b[21];
389 c[22] = a[4] * b[2] + a[8] * b[7] + a[11] * b[12] + a[13] * b[17] + a[14] * b[22];
390 c[23] = a[4] * b[3] + a[8] * b[8] + a[11] * b[13] + a[13] * b[18] + a[14] * b[23];
391 c[24] = a[4] * b[4] + a[8] * b[9] + a[11] * b[14] + a[13] * b[19] + a[14] * b[24];
392
393 return kTRUE;
394}
395
396Bool_t Mult25On15(const vector<Double_t>& a, const vector<Double_t>& b, vector<Double_t>& c)
397{
398 if (a.size() != 25 || b.size() != 15 || c.size() != 25) {
399 cout << "-E- Mult15On25: size is not correct" << endl;
400 return kFALSE;
401 }
402 c[0] = a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3] + a[4] * b[4];
403 c[1] = a[0] * b[1] + a[1] * b[5] + a[2] * b[6] + a[3] * b[7] + a[4] * b[8];
404 c[2] = a[0] * b[2] + a[1] * b[6] + a[2] * b[9] + a[3] * b[10] + a[4] * b[11];
405 c[3] = a[0] * b[3] + a[1] * b[7] + a[2] * b[10] + a[3] * b[12] + a[4] * b[13];
406 c[4] = a[0] * b[4] + a[1] * b[8] + a[2] * b[11] + a[3] * b[13] + a[4] * b[14];
407 c[5] = a[5] * b[0] + a[6] * b[1] + a[7] * b[2] + a[8] * b[3] + a[9] * b[4];
408 c[6] = a[5] * b[1] + a[6] * b[5] + a[7] * b[6] + a[8] * b[7] + a[9] * b[8];
409 c[7] = a[5] * b[2] + a[6] * b[6] + a[7] * b[9] + a[8] * b[10] + a[9] * b[11];
410 c[8] = a[5] * b[3] + a[6] * b[7] + a[7] * b[10] + a[8] * b[12] + a[9] * b[13];
411 c[9] = a[5] * b[4] + a[6] * b[8] + a[7] * b[11] + a[8] * b[13] + a[9] * b[14];
412 c[10] = a[10] * b[0] + a[11] * b[1] + a[12] * b[2] + a[13] * b[3] + a[14] * b[4];
413 c[11] = a[10] * b[1] + a[11] * b[5] + a[12] * b[6] + a[13] * b[7] + a[14] * b[8];
414 c[12] = a[10] * b[2] + a[11] * b[6] + a[12] * b[9] + a[13] * b[10] + a[14] * b[11];
415 c[13] = a[10] * b[3] + a[11] * b[7] + a[12] * b[10] + a[13] * b[12] + a[14] * b[13];
416 c[14] = a[10] * b[4] + a[11] * b[8] + a[12] * b[11] + a[13] * b[13] + a[14] * b[14];
417 c[15] = a[15] * b[0] + a[16] * b[1] + a[17] * b[2] + a[18] * b[3] + a[19] * b[4];
418 c[16] = a[15] * b[1] + a[16] * b[5] + a[17] * b[6] + a[18] * b[7] + a[19] * b[8];
419 c[17] = a[15] * b[2] + a[16] * b[6] + a[17] * b[9] + a[18] * b[10] + a[19] * b[11];
420 c[18] = a[15] * b[3] + a[16] * b[7] + a[17] * b[10] + a[18] * b[12] + a[19] * b[13];
421 c[19] = a[15] * b[4] + a[16] * b[8] + a[17] * b[11] + a[18] * b[13] + a[19] * b[14];
422 c[20] = a[20] * b[0] + a[21] * b[1] + a[22] * b[2] + a[23] * b[3] + a[24] * b[4];
423 c[21] = a[20] * b[1] + a[21] * b[5] + a[22] * b[6] + a[23] * b[7] + a[24] * b[8];
424 c[22] = a[20] * b[2] + a[21] * b[6] + a[22] * b[9] + a[23] * b[10] + a[24] * b[11];
425 c[23] = a[20] * b[3] + a[21] * b[7] + a[22] * b[10] + a[23] * b[12] + a[24] * b[13];
426 c[24] = a[20] * b[4] + a[21] * b[8] + a[22] * b[11] + a[23] * b[13] + a[24] * b[14];
427
428 return kTRUE;
429}
#define SM33
#define SM12
#define SM13
#define SM40
Bool_t Similarity(const vector< Double_t > &a, const vector< Double_t > &b, vector< Double_t > &c)
#define SM14
Bool_t Mult25On5(const vector< Double_t > &a, const vector< Double_t > &b, vector< Double_t > &c)
Bool_t Subtract(const vector< Double_t > &a, const vector< Double_t > &b, vector< Double_t > &c)
#define SM23
#define SM22
#define SM10
Bool_t Mult25(const vector< Double_t > &a, const vector< Double_t > &b, vector< Double_t > &c)
#define SM00
Bool_t Mult15On25(const vector< Double_t > &a, const vector< Double_t > &b, vector< Double_t > &c)
#define SM30
#define SM01
Bool_t Transpose25(vector< Double_t > &a)
#define SM02
#define SM41
#define SM21
Bool_t Mult15On5(const vector< Double_t > &a, const vector< Double_t > &b, vector< Double_t > &c)
#define SM32
#define SM11
#define SM20
#define SM44
#define SM04
#define SM43
#define SM31
#define SM03
#define SM34
#define SM42
Bool_t InvSym15(vector< Double_t > &a)
Bool_t Add(const vector< Double_t > &a, const vector< Double_t > &b, vector< Double_t > &c)
Bool_t Mult25On15(const vector< Double_t > &a, const vector< Double_t > &b, vector< Double_t > &c)
#define SM24
int i
Definition P4_F32vec4.h:22
bool Bool_t
constexpr Bool_t kFALSE
double Double_t
constexpr Bool_t kTRUE