// SMatrix example of usage /** \page SMatrixDoc SMatrix Class Properties The template ROOT::Math::SMatrix class has 4 template parameters which define, at compile time, its properties. These are:
Here are some examples on how to create a matrix. We use typedef's in the following examples to avoid the full C++ names for the matrix classes. Notice that for a general matrix the representation has the default value, ROOT::Math::MatRepStd, and it is not needed to be specified. Furtheremore, for a general square matrix, the number of column may be as well omitted.
// typedef definitions used in the following declarations typedef ROOT::Math::SMatrix<double,3> SMatrix33; typedef ROOT::Math::SMatrix<double,2> SMatrix22; typedef ROOT::Math::SMatrix<double,3,3,ROOT::Math::MatRepSym<double,3> > SMatrixSym3; typedef ROOT::Math::SVector>double,2> SVector2; typedef ROOT::Math::SVector>double,3> SVector3; typedef ROOT::Math::SVector>double,6> SVector6; SMatrix33 m0; // create a zero 3x3 matrix // create an 3x3 identity matrix SMatrix33 i = ROOT::Math::SMatrixIdentity(); double a[9] = {1,2,3,4,5,6,7,8,9}; // input matrix data SMatrix33 m(a,9); // create a matrix using the a[] data // this will produce the 3x3 matrix // ( 1 2 3 // 4 5 6 // 7 8 9 )Example to create a symmetric matrix from an std::vector:
std::vector<double> v(6); for (int i = 0; i<6; ++i) v[i] = double(i+1); SMatrixSym3 s(v.begin(),v.end()) // this will produce the symmetric matrix // ( 1 2 4 // 2 3 5 // 4 5 6 ) // create a a general matrix from a symmetric matrix. The opposite will not compile SMatrix33 m2 = s;Example to create a symmetric matrix from a ROOT::Math::SVector contining the lower/upper data block:
ROOT::Math::SVectorr<double, 6> v(1,2,3,4,5,6); SMatrixSym3 s1(v); // lower block (default) // this will produce the symmetric matrix // ( 1 2 4 // 2 3 5 // 4 5 6 ) SMatrixSym3 s2(v,false); // upper block // this will produce the symmetric matrix // ( 1 2 3 // 2 4 5 // 3 5 6 )
SMatrix33 m; m(0,0) = 1; // set the element in first row and first column *(m.begin()+1) = 2; // set the second element (0,1) double d[9]={1,2,3,4,5,6,7,8,9}; m.SetElements(d,d+9); // set the d[] values in m double x = m(2,1); // return the element in third row and first column x = m.apply(7); // return the 8-th element (row=2,col=1) x = *(m.begin()+7); // return the 8-th element (row=2,col=1) // symmetric matrices (note the difference in behavior between apply and the iterators) x = *(m.begin()+4) // return the element (row=2,col=1). x = m.apply(7); // returns again the (row=2,col=1) elementThere are methods to place and/or retrieve ROOT::Math::SVector objects as rows or columns in (from) a matrix. In addition one can put (get) a sub-matrix as another ROOT::Math::SMatrix object in a matrix. If the size of the the sub-vector or sub-matrix are larger than the matrix size a static assert ( a compilation error) is produced. The non-const methods are:
SMatrix33 m; SVector2 v2(1,2); // place a vector of size 2 in the first row starting from element (0,1) : m(0,1) = v2[0] m.Place_in_row(v2,0,1); // place the vector in the second column from (0,1) : m(0,1) = v2[0] m.Place in_col(v2,0,1); SMatrix22 m2; // place the sub-matrix m2 in m starting from the element (1,1) : m(1,1) = m2(0,0) m.Place_at(m2,1,1); SVector3 v3(1,2,3); // set v3 as the diagonal elements of m : m(i,i) = v3[i] for i=0,1,2 m.SetDiagonal(v3)The const methods retrieving contents (getting slices of a matrix) are:
a = {1,2,3,4,5,6,7,8,9}; SMatrix33 m(a,a+9); SVector3 irow = m.Row(0); // return as vector the first matrix row SVector3 jcol = m.Col(1); // return as vector the second matrix column // return a slice of the first row from element (0,1) : r2[0] = m(0,1); r2[1] = m(0,2) SVector2 r2 = m.SubRow<SVector2> (0,1); // return a slice of the second column from element (0,1) : c2[0] = m(0,1); c2[1] = m(1,1); SVector2 c2 = m.SubCol<SVector2> (1,0); // return a sub-matrix 2x2 with the upper left corner at the values (1,1) SMatrix22 subM = m.Sub<SMatrix22> (1,1); // return the diagonal element in a SVector SVector3 diag = m.Diagonal(); // return the upper(lower) block of the matrix m SVector6 vub = m.UpperBlock(); // vub = [ 1, 2, 3, 5, 6, 9 ] SVector6 vlb = m.LowerBlock(); // vlb = [ 1, 4, 5, 7, 8, 9 ]
// Invert a NxN matrix. The inverted matrix replace the existing one and returns if the result is successful bool ret = m.Invert() // return the inverse matrix of m. If the inversion fails ifail is different than zero int ifail = 0; mInv = m.Inverse(ifail);The determinant of a square matrix can be obtained as follows:
double det; // calculate the determinant modyfing the matrix content. Returns if the calculation was successful bool ret = m.Det(det); // calculate the determinant using a temporary matrix but preserving the matrix content bool ret = n.Det2(det);