HepSymMatrix


This is very much like the HepMatrix, except of course it is restricted to Symmetric Matrix. All the operations for HepMatrix can also be done here (except for the +=, -=, *= that don't yield a symmetric matrix. e.g. +=(const Matrix &) is not defined)

The matrix is stored as a lower triangular matrix. In addition to the (row, col) method of finding element, fast(row, col) returns an element with checking to see if row and col need to be interchanged so that row >= col.

Author

Mike Smyth

See also

HepGenMatrix, HepMatrix, HepDiagMatrix, HepVector, HepPile,

Declaration

#include "CLHEP/Matrix/SymMatrix.h"

class HepSymMatrix : public HepGenMatrix

Public Member Classes

HepSymMatrix_row
Helper class to implement m[i][j]
Declaration
class HepSymMatrix_row
Constructor
inline HepSymMatrix_row(HepSymMatrix&, int)
[]
inline HepDouble & operator[](int)

HepSymMatrix_row_const
Helper class to implement m[i][j]
Declaration
class HepSymMatrix_row_const
Constructor
inline HepSymMatrix_row_const(const HepSymMatrix&, int)
[]
inline const HepDouble & operator[](int) const

Public Member Functions

Constructor
inline HepSymMatrix()
Default constructor. Gives 0 x 0 symmetric matrix.
Another HepSymMatrix can be assigned to it.
Constructor
HepSymMatrix(int p)
HepSymMatrix(int p, int)
Gives p x p symmetric matrix.
With a second argument, the matrix is initialized.
0 means a zero matrix, 1 means the identity matrix.
Constructor
#ifdef HEP_USE_RANDOM
HepSymMatrix(int p, HepRandom &r)
#endif
Constructor with a Random object.
Constructor
HepSymMatrix(const HepDiagMatrix &m1)
Constructor from HepDiagMatrix.
Copy constructor
HepSymMatrix(const HepSymMatrix &m1)
Destructor
virtual ~HepSymMatrix()
=
HepSymMatrix & operator = (const HepSymMatrix &m2)
HepSymMatrix & operator = (const HepDiagMatrix &m2)
Assignment operators. Notice that there is no HepSymMatrix = HepMatrix.
+=
HepSymMatrix & operator += (const HepSymMatrix &m2)
HepSymMatrix & operator += (const HepDiagMatrix &m2)
Add a HepSymMatrix.
-
HepSymMatrix operator - () const
Unary minus, i.e. flip the sign of each element.
-=
HepSymMatrix & operator -= (const HepSymMatrix &m2)
HepSymMatrix & operator -= (const HepDiagMatrix &m2)
Subtract a HepSymMatrix.
*=
HepSymMatrix & operator *= (HepDouble t)
Multiply a HepSymMatrix by a floating number.
/=
HepSymMatrix & operator /= (HepDouble t)
Divide a HepSymMatrix by a floating number.
()
const HepDouble & operator()(int row, int col) const
HepDouble & operator()(int row, int col)
Read and write a HepSymMatrix element.
** Note that indexing starts from (1,1) **
[]
inline HepSymMatrix_row operator[] (int)
inline HepSymMatrix_row_const operator[] (int) const
Read or write a matrix element.
While it may not look like it, you simply do m[i][j] to get an element.
** Note that the indexing starts from [0][0] **
apply
HepSymMatrix apply(HepDouble (*f)(HepDouble, int, int)) const
Apply a function to all elements of the matrix.
assign
void assign(const HepMatrix &m2)
Assigns m2 to s, assuming m2 is a symmetric matrix.

void assign(const HepSymMatrix &)
Another form of assignment. For consistency.
determinant
HepDouble determinant() const
Calculate the determinant of the matrix.
fast
const HepDouble & fast(int row, int col) const
HepDouble & fast(int row, int col)
Fast element access. Must be row >= col.
** Note that indexing starts from (1,1) **
inverse
inline HepSymMatrix inverse(int &ifail) const
Invert a HepSymMatrix. The matrix is not changed.
Returns 0 when successful, otherwise non-zero.

This inverse function has been taken from dsinv of CERNLIB. This function works with symmetric positive definit matrix only. If the the matrix is NOT positive definit, the inverse returns ifail of non-zero. Be sure to check this.

invert
void invert(int &ifail)
Invert a HepSymMatrix.
N.B. the contents of the matrix are replaced by the inverse.
Returns ifail = 0 (zero) when successful, otherwise non-zero.
This method has less overhead then inverse().

This invert function has been taken from dsinv of CERNLIB. This function works with symmetric positive definit matrix only. If the the matrix is NOT positive definit, the invert returns ifail of non-zero. Be sure to check this.

num_col
inline int num_col() const
Returns number of columns.
num_row
inline int num_row() const
Returns number of rows.
similarity
HepSymMatrix similarity(const HepMatrix &m1) const
HepSymMatrix similarity(const HepSymMatrix &m1) const
Returns m1*s*m1.T()

HepDouble similarity(const HepVector &v) const
Returns v.T()*s*v (This is a scaler).
similarityT
HepSymMatrix similarityT(const HepMatrix &m1) const
Temporary. Test of new similarity.
Returns m1.T()*s*m1
sub
HepSymMatrix sub(int min_row, int max_row) const
Returns a sub matrix of a HepSymMatrix.

void sub(int row, const HepSymMatrix &m1)
Sub matrix of this HepSymMatrix is replaced with m1.

#ifdef HEP_CC_NEED_SUB_WITHOUT_CONST
HepSymMatrix sub(int min_row, int max_row)
#endif
SGI CC bug. I have to have both with/without const. I should not need one without const.
T
HepSymMatrix T() const
Returns the transpose of a HepSymMatrix (which is itself).
trace
HepDouble trace() const
Calculate the trace of the matrix (sum of diagonal elements).

Non-Member Functions

+
HepMatrix operator + (const HepMatrix &m1, const HepSymMatrix &s2)
HepMatrix operator + (const HepSymMatrix &s1, const HepMatrix &m2)
HepSymMatrix operator + (const HepSymMatrix &s1, const HepSymMatrix &s2)
Addition operators.
-
HepMatrix operator - (const HepMatrix &m1, const HepSymMatrix &s2)
HepMatrix operator - (const HepSymMatrix &s1, const HepMatrix &m2)
HepSymMatrix operator - (const HepSymMatrix &s1, const HepSymMatrix &s2)
Subtraction operators.
*
HepMatrix operator * (const HepMatrix &m1, const HepSymMatrix &m2)
HepMatrix operator * (const HepSymMatrix &m1, const HepMatrix &m2)
HepMatrix operator * (const HepSymMatrix &m1, const HepSymMatrix &m2)
HepVector operator * (const HepSymMatrix &m1, const HepVector &m2)
Multiplication operators.
Note that m *= m1 is always faster than m = m * m1

HepSymMatrix operator * (HepDouble t, const HepSymMatrix &s1)
HepSymMatrix operator * (const HepSymMatrix &s1, HepDouble t)
Multiplication with a number.
/
HepSymMatrix operator / (const HepSymMatrix &s1, HepDouble t)
Division with a number.
Note that s /= t is faster if you can use it.
<<
ostream & operator << (ostream &s, const HepSymMatrix &q)
Output to a stream.
condition
HepDouble condition(const HepSymMatrix &m)
Find the condition number of a symmetric matrix.
diagonalize
HepMatrix diagonalize(HepSymMatrix *s)
Diagonalize a symmetric matrix.
It returns the matrix U so that s_old = U * s_diag * U.T()
diag_step
void diag_step(HepSymMatrix *t, int begin, int end)
void diag_step(HepSymMatrix *t, HepMatrix *u, int begin, int end)
Implicit symmetric QR step with Wilkinson Shift.
dsum
HepSymMatrix dsum(const HepSymMatrix &s1, const HepSymMatrix &s2)
Direct sum of two symmetric matrices.
house
HepVector house(const HepSymMatrix &a, int row=1, int col=1)
Returns a Householder vector to zero elements.
house_with_update2
void house_with_update2(HepSymMatrix *a, HepMatrix *v, int row=1, int col=1)
Finds and does Householder reflection on matrix.
tridiagonal
void tridiagonal(HepSymMatrix *a, HepMatrix *hsm)
HepMatrix tridiagonal(HepSymMatrix *a)
Does a Householder tridiagonalization of a symmetric matrix.
vT_times_v
HepSymMatrix vT_times_v(const HepVector &v)

Example

CLHEP/test/testMatrix.cc


8 October 1997
EVC