37 void invertMatrix(Int_t msize=6)
39 if (msize < 2 || msize > 10) {
40 std::cout <<
"2 <= msize <= 10" <<std::endl;
43 std::cout <<
"--------------------------------------------------------" <<std::endl;
44 std::cout <<
"Inversion results for a ("<<msize<<
","<<msize<<
") matrix" <<std::endl;
45 std::cout <<
"For each inversion procedure we check the maximum size " <<std::endl;
46 std::cout <<
"of the off-diagonal elements of Inv(A) * A " <<std::endl;
47 std::cout <<
"--------------------------------------------------------" <<std::endl;
49 TMatrixD H_square = THilbertMatrixD(msize,msize);
68 std::cout <<
"1. Use .InvertFast(&det)" <<std::endl;
70 std::cout <<
" for ("<<msize<<
","<<msize<<
") this is identical to .Invert(&det)" <<std::endl;
73 TMatrixD H1 = H_square;
79 TMatrixD U1(H1,TMatrixD::kMult,H_square);
80 TMatrixDDiag diag1(U1); diag1 = 0.0;
81 const Double_t U1_max_offdiag = (U1.Abs()).Max();
82 std::cout <<
" Maximum off-diagonal = " << U1_max_offdiag << std::endl;
83 std::cout <<
" Determinant = " << det1 << std::endl;
109 std::cout <<
"2. Use .Invert(&det)" << std::endl;
112 TMatrixD H2 = H_square;
115 TMatrixD U2(H2,TMatrixD::kMult,H_square);
116 TMatrixDDiag diag2(U2); diag2 = 0.0;
117 const Double_t U2_max_offdiag = (U2.Abs()).Max();
118 std::cout <<
" Maximum off-diagonal = " << U2_max_offdiag << std::endl;
119 std::cout <<
" Determinant = " << det2 << std::endl;
130 std::cout <<
"3. Use TDecompLU" << std::endl;
132 TMatrixD H3 = H_square;
133 TDecompLU lu(H_square);
142 Double_t d1_lu; Double_t d2_lu;
144 Double_t det3 = d1_lu*TMath::Power(2.,d2_lu);
146 TMatrixD U3(H3,TMatrixD::kMult,H_square);
147 TMatrixDDiag diag3(U3); diag3 = 0.0;
148 const Double_t U3_max_offdiag = (U3.Abs()).Max();
149 std::cout <<
" Maximum off-diagonal = " << U3_max_offdiag << std::endl;
150 std::cout <<
" Determinant = " << det3 << std::endl;
155 std::cout <<
"4. Use TDecompSVD on non-square matrix" << std::endl;
157 TMatrixD H_nsquare = THilbertMatrixD(msize,msize-1);
159 TDecompSVD svd(H_nsquare);
161 TMatrixD H4 = svd.Invert();
162 Double_t d1_svd; Double_t d2_svd;
163 svd.Det(d1_svd,d2_svd);
164 Double_t det4 = d1_svd*TMath::Power(2.,d2_svd);
166 TMatrixD U4(H4,TMatrixD::kMult,H_nsquare);
167 TMatrixDDiag diag4(U4); diag4 = 0.0;
168 const Double_t U4_max_offdiag = (U4.Abs()).Max();
169 std::cout <<
" Maximum off-diagonal = " << U4_max_offdiag << std::endl;
170 std::cout <<
" Determinant = " << det4 << std::endl;