CMS 3D CMS Logo

invertPosDefMatrix.h
Go to the documentation of this file.
1 #ifndef DataFormat_Math_invertPosDefMatrix_H
2 #define DataFormat_Math_invertPosDefMatrix_H
3 
4 #define SMATRIX_USE_CONSTEXPR
5 #include "Math/SMatrix.h"
6 #include "Math/CholeskyDecomp.h"
7 #include<type_traits>
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 
12  ROOT::Math::CholeskyDecomp<T,N> decomp(m);
13  if (!decomp) {
14  return m.Invert();
15  } else
16  decomp.Invert(m);
17  return true;
18 
19 }
20 
21 template<typename PDM2>
22 void fastInvertPDM2(PDM2&mm) {
23  auto m = mm.Array();
24 
26  auto c0 = one/m[0];
27  auto c1 = m[1]*m[1]* c0;
28  auto c2 = one/(m[2] - c1);
29 
30  auto li21 = c1 * c0 * c2;
31  m[0] = li21 + c0;
32  m[1] = - m[1]*c0*c2;
33  m[2] = c2;
34 }
35 
36 template<>
37 inline bool invertPosDefMatrix<double,1>(ROOT::Math::SMatrix<double,1,1,ROOT::Math::MatRepSym<double,1> > & m) {
38  m(0,0) = 1./m(0,0);
39  return true;
40 }
41 template<>
42 inline bool invertPosDefMatrix<float,1>(ROOT::Math::SMatrix<float,1,1,ROOT::Math::MatRepSym<float,1> > & m) {
43  m(0,0) = 1.f/m(0,0);
44  return true;
45 }
46 
47 
48 template<>
49 inline bool invertPosDefMatrix<double,2>(ROOT::Math::SMatrix<double,2,2,ROOT::Math::MatRepSym<double,2> > & m) {
50  fastInvertPDM2(m);
51  return true;
52 }
53 template<>
54 inline bool invertPosDefMatrix<float,2>(ROOT::Math::SMatrix<float,2,2,ROOT::Math::MatRepSym<float,2> > & m) {
55  fastInvertPDM2(m);
56  return true;
57 }
58 
59 
60 
61 template<typename T,unsigned int N>
62 inline bool invertPosDefMatrix(ROOT::Math::SMatrix<T,N,N,ROOT::Math::MatRepSym<T,N> > const & mIn,
63  ROOT::Math::SMatrix<T,N,N,ROOT::Math::MatRepSym<T,N> > & mOut) {
64 
65  ROOT::Math::CholeskyDecomp<T,N> decomp(mIn);
66  if (!decomp) {
67  mOut=mIn;
68  return mOut.Invert();
69  } else
70  decomp.Invert(mOut);
71  return true;
72 
73 }
74 
75 #endif
type
Definition: HCALResponse.h:21
bool invertPosDefMatrix< double, 1 >(ROOT::Math::SMatrix< double, 1, 1, ROOT::Math::MatRepSym< double, 1 > > &m)
bool invertPosDefMatrix< double, 2 >(ROOT::Math::SMatrix< double, 2, 2, ROOT::Math::MatRepSym< double, 2 > > &m)
bool invertPosDefMatrix(ROOT::Math::SMatrix< T, N, N, ROOT::Math::MatRepSym< T, N > > &m)
#define N
Definition: blowfish.cc:9
bool invertPosDefMatrix< float, 1 >(ROOT::Math::SMatrix< float, 1, 1, ROOT::Math::MatRepSym< float, 1 > > &m)
bool invertPosDefMatrix< float, 2 >(ROOT::Math::SMatrix< float, 2, 2, ROOT::Math::MatRepSym< float, 2 > > &m)
long double T
#define constexpr
void fastInvertPDM2(PDM2 &mm)