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