diff --git a/math/smatrix/doc/SMatrixClass.html b/math/smatrix/doc/SMatrixClass.html index d977e25c035ab..cacc292364012 100644 --- a/math/smatrix/doc/SMatrixClass.html +++ b/math/smatrix/doc/SMatrixClass.html @@ -1 +1,187 @@ -// 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);
+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); ++
Here are some examples on how to create a vector. In the following we assume that we are using the namespace ROOT::Math.
SVector>double,N> v; // create a vector of size N, v[i]=0 SVector>double,3> v(1,2,3); // create a vector of size 3, v[0]=1,v[1]=2,v[2]=3 double a[9] = {1,2,3,4,5,6,7,8,9}; // input data SVector>double,9> v(a,9); // create a vector using the a[] data
v[0] = 1; // set the first element v(1) = 2; // set the second element *(v.begin()+3) = 3; // set the third element // set vector elements from a std::vectorIn addition there are methods to place a sub-vector in a vector. If the size of the the sub-vector is larger than the vector size a static assert ( a compilation error) is produced.::iterator std::vectorw(3); v.SetElements(w.begin(),w.end()); double x = m(i); // return the i-th element x = m.apply(i); // return the i-th element x = *(m.begin()+i); // return the i-th element
SVector>double,N> v; SVector>double,M> w; // M <= N otherwise a compilation error is obtained later // place a vector of size M starting from element ioff, v[ioff + i] = w[i] v.Place_at(w,ioff); // return a sub-vector of size M starting from v[ioff]: w[i] = v[ioff + i] w = v.Sub < SVector>double,M> > (ioff);For additional Vector functionality see the \ref MatVecFunctions page */ \ No newline at end of file +// SVector example of usage + +/** + + \page SVectorDoc SVector Class Properties + + The template ROOT::Math::SVector class has 2 template parameters which define, at compile time, its properties. These are: +
Here are some examples on how to create a vector. In the following we assume that we are using the namespace ROOT::Math. +
++SVector>double,N> v; // create a vector of size N, v[i]=0 +SVector>double,3> v(1,2,3); // create a vector of size 3, v[0]=1,v[1]=2,v[2]=3 +double a[9] = {1,2,3,4,5,6,7,8,9}; // input data +SVector>double,9> v(a,9); // create a vector using the a[] data ++ +
+v[0] = 1; // set the first element +v(1) = 2; // set the second element +*(v.begin()+3) = 3; // set the third element + +// set vector elements from a std::vector+ +In addition there are methods to place a sub-vector in a vector. +If the size of the the sub-vector is larger than the vector size a static assert ( a compilation error) is produced. + +::iterator +std::vectorw(3); +v.SetElements(w.begin(),w.end()); + +double x = m(i); // return the i-th element +x = m.apply(i); // return the i-th element +x = *(m.begin()+i); // return the i-th element +
+SVector>double,N> v; +SVector>double,M> w; // M <= N otherwise a compilation error is obtained later +// place a vector of size M starting from element ioff, v[ioff + i] = w[i] +v.Place_at(w,ioff); +// return a sub-vector of size M starting from v[ioff]: w[i] = v[ioff + i] +w = v.Sub < SVector>double,M> > (ioff); ++ + +For additional Vector functionality see the \ref MatVecFunctions page + +*/ \ No newline at end of file