// 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) element                                        
There 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);