Jpp
software
JMath
JMatrix3S.hh
Go to the documentation of this file.
1
#ifndef __JMATRIX3S__
2
#define __JMATRIX3S__
3
4
#include <cmath>
5
#include <algorithm>
6
7
#include "
JMath/JMatrix3D.hh
"
8
#include "
JLang/JException.hh
"
9
10
11
/**
12
* \author mdejong
13
*/
14
15
namespace
JMATH
{}
16
namespace
JPP
{
using namespace
JMATH
; }
17
18
namespace
JMATH
{
19
20
using
JLANG::JDivisionByZero
;
21
22
23
/**
24
* 3 x 3 symmetric matrix
25
*/
26
class
JMatrix3S
:
27
public
JMatrix3D
28
{
29
public
:
30
/**
31
* Default constructor.
32
*/
33
JMatrix3S
() :
34
JMatrix3D
()
35
{}
36
37
38
/**
39
* Contructor.
40
*
41
* \param A matrix
42
*/
43
JMatrix3S
(
const
JMatrix3D
& A) :
44
JMatrix3D
(A)
45
{}
46
47
48
/**
49
* Contructor.\n
50
* The upper triangle is internally set.
51
*
52
* \param __a00 (0,0)
53
* \param __a10 (1,0)
54
* \param __a11 (1,1)
55
* \param __a20 (2,0)
56
* \param __a21 (2,1)
57
* \param __a22 (2,2)
58
*/
59
JMatrix3S
(
const
double
__a00,
60
const
double
__a10,
const
double
__a11,
61
const
double
__a20,
const
double
__a21,
const
double
__a22) :
62
JMatrix3D
(__a00, __a10, __a20,
63
__a10, __a11, __a21,
64
__a20, __a21, __a22)
65
{}
66
67
68
/**
69
* Invert matrix.
70
*/
71
void
invert
()
72
{
73
using
std::swap;
74
75
// LDU decomposition
76
77
int
p0 = 0;
// permute row 0
78
int
p1
= 0;
// permute row 1
79
80
double
val;
81
82
val =
a00
;
83
84
if
(fabs(
a10
) > fabs(val)) {
85
p0 = 1;
86
val =
a10
;
87
}
88
89
if
(fabs(
a20
) > fabs(val)) {
90
p0 = 2;
91
val =
a20
;
92
}
93
94
switch
(p0) {
95
96
case
1:
97
swap(
a00
,
a10
);
98
swap(
a01
,
a11
);
99
swap(
a02
,
a12
);
100
break
;
101
102
case
2:
103
swap(
a00
,
a20
);
104
swap(
a01
,
a21
);
105
swap(
a02
,
a22
);
106
break
;
107
}
108
109
if
(val == 0) {
110
throw
JDivisionByZero
(
"LDU decomposition zero pivot"
);
111
}
112
113
a10
/= val;
114
a11
-=
a10
*
a01
;
115
a12
-=
a10
*
a02
;
116
117
a20
/= val;
118
a21
-=
a20
*
a01
;
119
a22
-=
a20
*
a02
;
120
121
val =
a11
;
122
123
if
(fabs(
a21
) > fabs(val)) {
124
p1
= 2;
125
val =
a21
;
126
}
127
128
switch
(
p1
) {
129
130
case
2:
131
swap(
a10
,
a20
);
132
swap(
a11
,
a21
);
133
swap(
a12
,
a22
);
134
break
;
135
}
136
137
if
(val == 0) {
138
throw
JDivisionByZero
(
"LDU decomposition zero pivot"
);
139
}
140
141
a21
/= val;
142
a22
-=
a21
*
a12
;
143
144
// invert D
145
146
if
(
a22
== 0) {
147
throw
JDivisionByZero
(
"D matrix not invertable"
);
148
}
149
150
a00
= 1.0 /
a00
;
151
a11
= 1.0 /
a11
;
152
a22
= 1.0 /
a22
;
153
154
// invert U
155
156
a01
*= -
a00
;
157
a01
*=
a11
;
158
159
a02
*= -
a00
;
160
a02
-=
a01
*
a12
;
161
a02
*=
a22
;
162
163
a12
*= -
a11
;
164
a12
*=
a22
;
165
166
// invert L
167
168
a21
= -
a21
;
169
a20
= -
a20
;
170
a20
-=
a21
*
a10
;
171
a10
= -
a10
;
172
173
// U^-1 x L^-1
174
175
a00
+=
a01
*
a10
+
a02
*
a20
;
176
a01
+=
a02
*
a21
;
177
a10
*=
a11
;
178
a10
+=
a12
*
a20
;
179
a11
+=
a12
*
a21
;
180
a20
*=
a22
;
181
a21
*=
a22
;
182
183
switch
(
p1
) {
184
185
case
2:
186
swap(
a01
,
a02
);
187
swap(
a11
,
a12
);
188
swap(
a21
,
a22
);
189
break
;
190
}
191
192
switch
(p0) {
193
194
case
1:
195
swap(
a00
,
a01
);
196
swap(
a10
,
a11
);
197
swap(
a20
,
a21
);
198
break
;
199
200
case
2:
201
swap(
a00
,
a02
);
202
swap(
a10
,
a12
);
203
swap(
a20
,
a22
);
204
break
;
205
}
206
}
207
};
208
}
209
210
#endif
JException.hh
JMATH::JMatrix3D::a01
double a01
Definition:
JMath/JMatrix3D.hh:385
JMATH::JMatrix3S::invert
void invert()
Invert matrix.
Definition:
JMatrix3S.hh:71
JMATH::JMatrix3D::a21
double a21
Definition:
JMath/JMatrix3D.hh:387
JMATH::JMatrix3S
3 x 3 symmetric matrix
Definition:
JMatrix3S.hh:26
JMATH::JMatrix3D::a20
double a20
Definition:
JMath/JMatrix3D.hh:387
JMatrix3D.hh
JMATH::JMatrix3D
3 x 3 matrix
Definition:
JMath/JMatrix3D.hh:32
JMATH::JMatrix3S::JMatrix3S
JMatrix3S()
Default constructor.
Definition:
JMatrix3S.hh:33
JPP
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Definition:
JAAnetToolkit.hh:37
JMATH::JMatrix3S::JMatrix3S
JMatrix3S(const JMatrix3D &A)
Contructor.
Definition:
JMatrix3S.hh:43
JMATH::JMatrix3D::a00
double a00
Definition:
JMath/JMatrix3D.hh:385
JMATH::JMatrix3S::JMatrix3S
JMatrix3S(const double __a00, const double __a10, const double __a11, const double __a20, const double __a21, const double __a22)
Contructor.
Definition:
JMatrix3S.hh:59
JMATH::JMatrix3D::a12
double a12
Definition:
JMath/JMatrix3D.hh:386
JMATH
Auxiliary classes and methods for mathematical operations.
Definition:
JCalculator.hh:9
JMATH::JMatrix3D::a22
double a22
Definition:
JMath/JMatrix3D.hh:387
JLANG::JDivisionByZero
Exception for division by zero.
Definition:
JException.hh:270
JMATH::JMatrix3D::a11
double a11
Definition:
JMath/JMatrix3D.hh:386
p1
TPaveText * p1
Definition:
JDrawModule3D.cc:35
JMATH::JMatrix3D::a02
double a02
Definition:
JMath/JMatrix3D.hh:385
JMATH::JMatrix3D::a10
double a10
Definition:
JMath/JMatrix3D.hh:386
Generated by
1.8.16