CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
invertPosDefMatrix.h
Go to the documentation of this file.
1 #ifndef DataFormat_Math_invertPosDefMatrix_H
2 #define DataFormat_Math_invertPosDefMatrix_H
3 
4 #include "Math/SMatrix.h"
5 #include "Math/CholeskyDecomp.h"
6 // #include "DataFormats/Math/interface/CholeskyDecomp.h"
7 #include "SIMDVec.h"
8 
9 template<typename T,unsigned int N>
10 inline bool invertPosDefMatrix(ROOT::Math::SMatrix<T,N,N,ROOT::Math::MatRepSym<T,N> > & m) {
11 
13  if (!decomp) {
14  return m.Invert();
15  } else
16  decomp.Invert(m);
17  return true;
18 
19 }
20 
21 template<typename T,unsigned int N>
22 inline bool invertPosDefMatrix(ROOT::Math::SMatrix<T,N,N,ROOT::Math::MatRepSym<T,N> > const & mIn,
23  ROOT::Math::SMatrix<T,N,N,ROOT::Math::MatRepSym<T,N> > & mOut) {
24 
26  if (!decomp) {
27  mOut=mIn;
28  return mOut.Invert();
29  } else
30  decomp.Invert(mOut);
31  return true;
32 
33 }
34 
35 
36 // here for a test
37 #ifdef NEVER
38 // #if defined(USE_EXTVECT)
39 
40 namespace mathSSE {
41  struct M2 {
42  using Vec=Vec4<double>;
43  // the matrix is shuffed
44  Vec mm[2];
45 
46  double m00() const { return mm[0][0];}
47  double m01() const { return mm[0][1];}
48  double m11() const { return mm[1][0];}
49  double m10() const { return mm[1][1];}
50 
51  double & m00() { return mm[0][0];}
52  double & m01() { return mm[0][1];}
53  double & m11() { return mm[1][0];}
54  double & m10() { return mm[1][1];}
55 
56 
57  // load shuffled
58  inline M2(double i00, double i01, double i10, double i11) {
59  m00()=i00; m01()=i01; m11()=i11; m10()=i10; }
60 
61  Vec & r0() { return mm[0]; }
62  Vec & r1() { return mm[1]; }
63 
64  Vec const & r0() const { return mm[0]; }
65  Vec const & r1() const { return mm[1]; }
66 
67 
68  // assume second row is already shuffled
69  inline bool invert() {
70  Vec tmp = r1();
71  // mult and sub
72  Vec det = r0()*tmp;
73  Vec det2{det[1],det[0]};
74  // det and -det
75  det -= det2;
76  // m0 /det, m1/-det -> m3, m2
77  r1() = r0()/det;
78  // m3/det, m2/-det -> m0 m1
79  r0() = tmp/det;
80  return (0.!=det[0]);
81  }
82 
83  };
84 }
85 
86 template<>
87 inline bool invertPosDefMatrix<double,2>(ROOT::Math::SMatrix<double,2,2,ROOT::Math::MatRepSym<double,2> > & m) {
88  mathSSE::M2 mm(m.Array()[0], m.Array()[1], m.Array()[1], m.Array()[2]);
89 
90  bool ok = mm.invert();
91  if (ok) {
92  m.Array()[0] = mm.m00();
93  m.Array()[1] = mm.m01();
94  m.Array()[2] = mm.m11();
95  }
96  return ok;
97 }
98 
99 template<>
100 inline bool invertPosDefMatrix<double,2>(ROOT::Math::SMatrix<double,2,2,ROOT::Math::MatRepSym<double,2> > const & mIn,
101  ROOT::Math::SMatrix<double,2,2,ROOT::Math::MatRepSym<double,2> > & mOut) {
102 
103  mathSSE::M2 mm(mIn.Array()[0], mIn.Array()[1], mIn.Array()[1], mIn.Array()[2]);
104 
105  bool ok = mm.invert();
106  mOut.Array()[0] = mm.m00();
107  mOut.Array()[1] = mm.m01();
108  mOut.Array()[2] = mm.m11();
109 
110  return ok;
111 }
112 
113 
114 
115 
116 #endif
117 
118 
119 #endif
bool Invert(M &m) const
place the inverse into m
ExtVec< T, 4 > Vec4
Definition: ExtVec.h:23
class to compute the Cholesky decomposition of a matrix
bool invertPosDefMatrix(ROOT::Math::SMatrix< T, N, N, ROOT::Math::MatRepSym< T, N > > &m)
#define N
Definition: blowfish.cc:9
std::vector< std::vector< double > > tmp
Definition: MVATrainer.cc:100
long double T