Jpp - the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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 
21 
22 
23  /**
24  * 3 x 3 symmetric matrix
25  */
26  class JMatrix3S :
27  public JMatrix3D
28  {
29  public:
30  /**
31  * Default constructor.
32  */
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
Exceptions.
JMatrix3S(const double __a00, const double __a10, const double __a11, const double __a20, const double __a21, const double __a22)
Contructor.
Definition: JMatrix3S.hh:59
TPaveText * p1
3 x 3 matrix
void invert()
Invert matrix.
Definition: JMatrix3S.hh:71
JMatrix3S()
Default constructor.
Definition: JMatrix3S.hh:33
3 x 3 symmetric matrix
Definition: JMatrix3S.hh:26
Exception for division by zero.
Definition: JException.hh:270
JMatrix3S(const JMatrix3D &A)
Contructor.
Definition: JMatrix3S.hh:43
source $JPP_DIR setenv csh $JPP_DIR eval JShellParser o a A