#include <MatrixSquareSymmetric.hpp>
Square Symmetric matrices
Public Member Functions | |
MatrixSquareSymmetric (int nrow=0) | |
MatrixSquareSymmetric (const MatrixSquareSymmetric &m) | |
MatrixSquareSymmetric (const AMatrix &m) | |
MatrixSquareSymmetric & | operator= (const MatrixSquareSymmetric &m) |
virtual | ~MatrixSquareSymmetric () |
bool | mustBeSymmetric () const final |
ICloneable interface. More... | |
bool | isSymmetric (bool printWhyNot=false, double eps=EPSILON10) const final |
Is the matrix symmetrical ? More... | |
void | normMatrix (const AMatrix &y, const AMatrixSquare &x=AMatrixSquare(), bool transpose=false) |
int | computeEigen (bool optionPositive=true) |
int | computeGeneralizedEigen (const MatrixSquareSymmetric &b, bool optionPositive=true) |
int | computeGeneralizedInverse (MatrixSquareSymmetric &tabout, double maxicond=1.e20, double eps=EPSILON20) |
bool | isDefinitePositive () |
int | minimizeWithConstraintsInPlace (const VectorDouble &gmat, const MatrixRectangular &aemat, const VectorDouble &bemat, const MatrixRectangular &aimat, const VectorDouble &bimat, VectorDouble &xmat) |
int | getTriangleSize () const |
int | computeCholesky () |
int | invertCholesky () |
int | solveCholeskyMat (const MatrixRectangular &b, MatrixRectangular &x) |
int | solveCholesky (const VectorDouble &b, VectorDouble &x) |
VectorDouble | getCholeskyTL () const |
double | getCholeskyTL (int i, int j) const |
VectorDouble | getCholeskyXL () const |
double | getCholeskyXL (int i, int j) const |
double | computeCholeskyLogDeterminant () const |
virtual bool | _isPhysicallyPresent (int irow, int icol) const override |
virtual void | _setValues (const double *values, bool byCol=true) override |
virtual int | _invert () override |
void | _recopy (const MatrixSquareSymmetric &r) |
int | _matrix_qo (const VectorDouble &gmat, VectorDouble &xmat) |
int | _matrix_qoc (bool flag_invert, const VectorDouble &gmat, int na, const MatrixRectangular &amat, const VectorDouble &bmat, VectorDouble &xmat, VectorDouble &lambda) |
int | _constraintsError (const VectorInt &active, const MatrixRectangular &aimat, const VectorDouble &bimat, const VectorDouble &xmat, VectorDouble &vmat, VectorInt &flag) |
bool | _checkCholeskyAlreadyPerformed (int status) const |
int | _terminateEigen (const VectorDouble &eigenValues, const VectorDouble &eigenVectors, bool optionPositive=true, bool changeOrder=false) |
Public Member Functions inherited from AMatrixSquare | |
AMatrixSquare (int nrow=0) | |
AMatrixSquare (const AMatrixSquare &r) | |
AMatrixSquare (const AMatrix &m) | |
AMatrixSquare & | operator= (const AMatrixSquare &r) |
virtual | ~AMatrixSquare () |
virtual double | determinant (void) const |
Interface for AMatrix. More... | |
bool | isSquare (bool printWhyNot=false) const override |
int | getNSize () const |
double | trace () const |
void | innerMatrix (const AMatrixSquare &x, const AMatrix &r1, const AMatrix &r2) |
void | prodDiagByVector (const VectorDouble &diag) |
void | divideDiagByVector (const VectorDouble &diag) |
void | prodByDiagInPlace (int mode, const VectorDouble &c) |
double | normVec (const VectorDouble &vec) |
Public Member Functions inherited from MatrixRectangular | |
MatrixRectangular (int nrow=0, int ncol=0) | |
MatrixRectangular (const MatrixRectangular &r) | |
MatrixRectangular (const AMatrix &m) | |
MatrixRectangular & | operator= (const MatrixRectangular &r) |
virtual | ~MatrixRectangular () |
void | addRow (int nrow_added=1) |
void | addColumn (int ncolumn_added=1) |
Public Member Functions inherited from AMatrixDense | |
AMatrixDense (int nrow=0, int ncol=0) | |
AMatrixDense (const AMatrixDense &r) | |
AMatrixDense (const AMatrix &m) | |
AMatrixDense & | operator= (const AMatrixDense &r) |
virtual | ~AMatrixDense () |
bool | isDense () const override |
Interface for AMatrix. More... | |
bool | isSparse () const override |
void | setValue (int irow, int icol, double value, bool flagCheck=false) override |
virtual double | getValue (int irow, int icol, bool flagCheck=false) const override |
void | updValue (int irow, int icol, const EOperator &oper, double value, bool flagCheck=false) override |
virtual void | setColumn (int icol, const VectorDouble &tab, bool flagCheck=true) override |
virtual void | setRow (int irow, const VectorDouble &tab, bool flagCheck=true) override |
virtual void | setDiagonal (const VectorDouble &tab, bool flagCheck=true) override |
virtual void | setDiagonalToConstant (double value=1.) override |
virtual void | addScalar (double v) override |
virtual void | addScalarDiag (double v) override |
virtual void | prodScalar (double v) override |
virtual void | fill (double value) override |
virtual void | multiplyRow (const VectorDouble &vec) override |
virtual void | multiplyColumn (const VectorDouble &vec) override |
virtual void | divideRow (const VectorDouble &vec) override |
virtual void | divideColumn (const VectorDouble &vec) override |
virtual VectorDouble | prodVecMat (const VectorDouble &x, bool transpose=false) const override |
virtual VectorDouble | prodMatVec (const VectorDouble &x, bool transpose=false) const override |
virtual VectorDouble | getRow (int irow) const override |
virtual VectorDouble | getColumn (int icol) const override |
virtual void | prodMatMatInPlace (const AMatrix *x, const AMatrix *y, bool transposeX=false, bool transposeY=false) override |
void | addMatInPlace (const AMatrixDense &y, double cx=1., double cy=1.) |
The next functions use specific definition of matrix (to avoid dynamic_cast) rather than manipulating AMatrix. They are not generic of AMatrix anymore. WARNING: output matrix should not match any of input matrices (speed up). More... | |
virtual void | prodNormMatMatInPlace (const AMatrixDense &a, const AMatrixDense &m, bool transpose=false) |
virtual void | prodNormMatInPlace (const AMatrixDense &a, const VectorDouble &vec=VectorDouble(), bool transpose=false) |
VectorDouble | getEigenValues () const |
const MatrixSquareGeneral * | getEigenVectors () const |
Public Member Functions inherited from AMatrix | |
AMatrix (int nrow=0, int ncol=0) | |
AMatrix (const AMatrix &m) | |
AMatrix & | operator= (const AMatrix &m) |
virtual | ~AMatrix () |
virtual void | reset (int nrows, int ncols) |
virtual void | resetFromValue (int nrows, int ncols, double value) |
Reset the matrix to new dimensions and fill with a new value. More... | |
virtual void | resetFromArray (int nrows, int ncols, const double *tab, bool byCol=true) |
Reset the matrix from an array of double values. More... | |
virtual void | resetFromVD (int nrows, int ncols, const VectorDouble &tab, bool byCol=true) |
Reset the matrix from a vector of double values. More... | |
virtual void | resetFromVVD (const VectorVectorDouble &tab, bool byCol=true) |
Reset the matrix from an array of double values. More... | |
virtual String | toString (const AStringFormat *strfmt=nullptr) const override |
Interface to AStringable. More... | |
virtual bool | isValid (int irow, int icol, bool printWhyNot=false) const |
virtual bool | isIdentity (bool printWhyNot=false) const |
virtual void | transposeInPlace () |
virtual AMatrix * | transpose () const |
virtual NF_Triplet | getMatrixToTriplet (int shiftRow=0, int shiftCol=0) const |
void | addMatInPlace (const AMatrix &y, double cx=1., double cy=1.) |
void | prodMatInPlace (const AMatrix *matY, bool transposeY=false) |
void | prodNormMatMatInPlace (const AMatrix &a, const AMatrix &m, bool transpose=false) |
void | prodNormMatInPlace (const AMatrix &a, const VectorDouble &vec=VectorDouble(), bool transpose=false) |
void | resize (int nrows, int ncols) |
Resize the matrix to new dimensions (this method doesn't change the storage type) More... | |
void | addValue (int irow, int icol, double value) |
bool | isSame (const AMatrix &m, double eps=EPSILON4, bool printWhyNot=false) |
bool | isSameSize (const AMatrix &m) const |
bool | empty () const |
double | compare (const AMatrix &mat) const |
int | getNRows () const |
int | getNCols () const |
int | size () const |
VectorDouble | getValues (bool byCol=true) const |
VectorDouble | getDiagonal (int shift=0) const |
bool | isColumnDefined (int icol) const |
bool | isRowDefined (int irow) const |
int | getNumberColumnDefined () const |
int | getNumberRowDefined () const |
bool | isNonNegative (bool verbose=false) const |
void | prodMatVecInPlace (const VectorDouble &x, VectorDouble &y, bool transpose=false) const |
void | prodMatVecInPlacePtr (const double *x, double *y, bool transpose=false) const |
void | prodVecMatInPlace (const VectorDouble &x, VectorDouble &y, bool transpose=false) const |
void | prodVecMatInPlacePtr (const double *x, double *y, bool transpose=false) const |
double | quadraticMatrix (const VectorDouble &x, const VectorDouble &y) |
int | invert () |
int | solve (const VectorDouble &b, VectorDouble &x) const |
void | dumpElements (const String &title, int ifrom, int ito) const |
void | setIdentity (double value=1.) |
void | fillRandom (int seed=432432, double zeroPercent=0.1) |
void | setValues (const VectorDouble &values, bool byCol=true) |
double | getMeanByColumn (int icol) const |
double | getMinimum () const |
double | getMaximum () const |
double | getNormInf () const |
void | copyReduce (const AMatrix *x, const VectorInt &validRows, const VectorInt &validCols) |
void | copyElements (const AMatrix &m, double factor=1.) |
void | setFlagCheckAddress (bool flagCheckAddress) |
void | makePositiveColumn () |
void | linearCombination (double val1, const AMatrix *mat1, double val2=1., const AMatrix *mat2=nullptr, double val3=1., const AMatrix *mat3=nullptr) |
double | operator() (int row, int col) const |
double & | operator() (int row, int col) |
Public Member Functions inherited from AStringable | |
AStringable () | |
AStringable (const AStringable &r) | |
AStringable & | operator= (const AStringable &r) |
virtual | ~AStringable () |
virtual void | display (const AStringFormat *strfmt=nullptr) const final |
virtual void | display (int level) const final |
Public Member Functions inherited from ICloneable | |
ICloneable () | |
virtual | ~ICloneable () |
virtual ICloneable * | clone () const =0 |
Static Public Member Functions | |
static MatrixSquareSymmetric * | createFromVVD (const VectorVectorDouble &X) |
static MatrixSquareSymmetric * | createFromVD (const VectorDouble &X, int nrow) |
static MatrixSquareSymmetric * | createFromTLTU (int neq, const VectorDouble &tl) |
static MatrixSquareSymmetric * | createFromTriangle (int mode, int neq, const VectorDouble &tl) |
static MatrixRectangular | productCholeskyInPlace (int mode, int neq, int nrhs, const VectorDouble &tl, const MatrixRectangular &a) |
static MatrixSquareSymmetric | normCholeskyInPlace (int mode, int neq, const VectorDouble &tl, const MatrixSquareSymmetric &a) |
static int | _constraintsConcatenateMat (int nae, int nai, int neq, const VectorInt &active, const MatrixRectangular &tabemat, const MatrixRectangular &tabimat, MatrixRectangular &tabout) |
static int | _constraintsConcatenateVD (int nae, int nai, const VectorInt &active, const VectorDouble &tabemat, const VectorDouble &tabimat, VectorDouble &tabout) |
static int | _constraintsCount (int nai, VectorInt &active) |
Static Public Member Functions inherited from MatrixRectangular | |
static MatrixRectangular * | createFromVVD (const VectorVectorDouble &X) |
static MatrixRectangular * | createFromVD (const VectorDouble &X, int nrow, int ncol, bool byCol=false, bool invertColumnOrder=false) |
static MatrixRectangular * | glue (const AMatrix *A1, const AMatrix *A2, bool flagShiftRow, bool flagShiftCol) |
Public Attributes | |
DECLARE_TOTL | |
Has a specific implementation in the Target language. More... | |
Public Attributes inherited from MatrixRectangular | |
DECLARE_TOTL | |
Has a specific implementation in the Target language. More... | |
MatrixSquareSymmetric::MatrixSquareSymmetric | ( | int | nrow = 0 | ) |
MatrixSquareSymmetric::MatrixSquareSymmetric | ( | const MatrixSquareSymmetric & | m | ) |
MatrixSquareSymmetric::MatrixSquareSymmetric | ( | const AMatrix & | m | ) |
|
virtual |
bool MatrixSquareSymmetric::_checkCholeskyAlreadyPerformed | ( | int | status | ) | const |
|
static |
Concatenate the equality and the active inequality material
[in] | nae | Number of equalities |
[in] | nai | Number of inequalities |
[in] | neq | First dimension of the array |
[in] | active | Array of active/non active inequalities |
[in] | tabemat | Equality material (Dimension: neq * nai) |
[in] | tabimat | Inequality material |
[out] | tabout | Output array |
|
static |
Concatenate the equality and the active inequality material
[in] | nae | Number of equalities |
[in] | nai | Number of inequalities |
[in] | active | Array of active/non active inequalities |
[in] | tabemat | Equality material (Dimension: neq * nai) |
[in] | tabimat | Inequality material |
[out] | tabout | Output array |
|
static |
Count the number of active constraints
[in] | nai | Number of constraints |
[in] | active | Array of constraint status |
int MatrixSquareSymmetric::_constraintsError | ( | const VectorInt & | active, |
const MatrixRectangular & | aimat, | ||
const VectorDouble & | bimat, | ||
const VectorDouble & | xmat, | ||
VectorDouble & | vmat, | ||
VectorInt & | flag | ||
) |
Calculate how constraints are fulfilled
[in] | active | Array of active/non active inequalities (optional) |
[in] | aimat | Inequality material (Dimension: neq * nai) |
[in] | bimat | right-hand side for inequalities (Dimension: nai) |
[out] | xmat | solution of the linear system with no constraint (neq) |
[out] | vmat | matrix of errors (if not NULL) |
[out] | flag | array specifying if constraint is active (if not NULL) |
|
overridevirtual |
Reimplemented from AMatrixDense.
|
overridevirtual |
Say if (irow, icol) is stored physically or not
Reimplemented from AMatrix.
int MatrixSquareSymmetric::_matrix_qo | ( | const VectorDouble & | gmat, |
VectorDouble & | xmat | ||
) |
Solve a linear system: H %*% g = x
[in] | gmat | right-hand side vector (Dimension: neq) |
[out] | xmat | solution vector (Dimension: neq) |
int MatrixSquareSymmetric::_matrix_qoc | ( | bool | flag_invert, |
const VectorDouble & | gmat, | ||
int | na, | ||
const MatrixRectangular & | amat, | ||
const VectorDouble & | bmat, | ||
VectorDouble & | xmat, | ||
VectorDouble & | lambda | ||
) |
Minimize 1/2 t(x) %*% H %*% x + t(g) %*% x under the constraints t(A) %*% x = b
[in] | flag_invert | Tells if the inverse has already been calculated |
[in] | gmat | right-hand side vector (Dimension: neq) |
[in] | na | Number of equalities |
[in] | amat | matrix for inequalities (Dimension: neq * na) |
[in] | bmat | inequality vector (Dimension: na) |
[in] | xmat | solution of the linear system with no constraint. On return, solution with constraints (Dimension: neq) |
[out] | lambda | working vector (Dimension: na) |
void MatrixSquareSymmetric::_recopy | ( | const MatrixSquareSymmetric & | r | ) |
|
overridevirtual |
Reimplemented from AMatrix.
int MatrixSquareSymmetric::_terminateEigen | ( | const VectorDouble & | eigenValues, |
const VectorDouble & | eigenVectors, | ||
bool | optionPositive = true , |
||
bool | changeOrder = false |
||
) |
int MatrixSquareSymmetric::computeCholesky | ( | ) |
Performs the Cholesky triangular decomposition of a definite positive symmetric matrix A = t(TL) * TL
double MatrixSquareSymmetric::computeCholeskyLogDeterminant | ( | ) | const |
int MatrixSquareSymmetric::computeEigen | ( | bool | optionPositive = true | ) |
int MatrixSquareSymmetric::computeGeneralizedEigen | ( | const MatrixSquareSymmetric & | b, |
bool | optionPositive = true |
||
) |
int MatrixSquareSymmetric::computeGeneralizedInverse | ( | MatrixSquareSymmetric & | tabout, |
double | maxicond = 1.e20 , |
||
double | eps = EPSILON20 |
||
) |
Calculate the generalized inverse of the input square symmetric matrix
[out] | tabout | Inverted matrix (suqrae symmetric) |
[out] | maxicond | Maximum value for the Condition Index (MAX(ABS(eigval))) |
[in] | eps | Tolerance |
|
static |
Create the Symmetric matrix as the product of 'tl' (lower triangle) by its transpose
[in] | neq | Number of rows or columns in the system |
[in] | tl | Lower triangular matrix defined by column (Dimension; neq*(neq+1)/2) |
|
static |
Fill a square matrix with a triangular matrix
[in] | mode | 0: TL (upper); 1: TL (lower) |
[in] | neq | number of equations in the system |
[in] | tl | Triangular matrix (lower part) |
|
static |
|
static |
Converts a VectorVectorDouble into a Square Symmetric Matrix Note: the input argument is stored by row (if coming from [] specification)
X | Input VectorVectorDouble argument |
VectorDouble MatrixSquareSymmetric::getCholeskyTL | ( | ) | const |
double MatrixSquareSymmetric::getCholeskyTL | ( | int | i, |
int | j | ||
) | const |
VectorDouble MatrixSquareSymmetric::getCholeskyXL | ( | ) | const |
double MatrixSquareSymmetric::getCholeskyXL | ( | int | i, |
int | j | ||
) | const |
int MatrixSquareSymmetric::getTriangleSize | ( | ) | const |
int MatrixSquareSymmetric::invertCholesky | ( | ) |
Invert the Cholesky matrix
bool MatrixSquareSymmetric::isDefinitePositive | ( | ) |
Check if a matrix is definite positive
|
inlinefinalvirtual |
Is the matrix symmetrical ?
Reimplemented from AMatrix.
int MatrixSquareSymmetric::minimizeWithConstraintsInPlace | ( | const VectorDouble & | gmat, |
const MatrixRectangular & | aemat, | ||
const VectorDouble & | bemat, | ||
const MatrixRectangular & | aimat, | ||
const VectorDouble & | bimat, | ||
VectorDouble & | xmat | ||
) |
Minimize 1/2 t(x) %*% H %*% x + t(g) %*% x under the constraints t(Ae) %*% x = be and t(Ai) %*% x = bi
[in] | gmat | right-hand side vector (Dimension: neq) |
[in] | aemat | Matrix rectangular for equalities (Dimension: neq * nae) |
[in] | bemat | right-hand side for equalities (Dimension: nae) |
[in] | aimat | Matrix rectangular for inequalities (Dimension: neq * nai) |
[in] | bimat | right-hand side for inequalities (Dimension: nai) |
[in,out] | xmat | solution of the linear system with constraints (neq) |
REMARKS: The initial xmat has to be satisfied by all the constraints.
|
inlinefinalvirtual |
ICloneable interface.
Interface to AMatrix
Say if the matrix must be symmetric
Reimplemented from MatrixRectangular.
|
static |
Performs the product B = TL * A * TU or TU * A * TL where TL,TU is a triangular matrix and A a square symmetric matrix
[in] | mode | 0: TL * A * TU; 1: TU * A * TL |
[in] | neq | number of equations in the system |
[in] | tl | Triangular matrix defined by column |
[in] | a | Square symmetric matrix (optional) |
void MatrixSquareSymmetric::normMatrix | ( | const AMatrix & | y, |
const AMatrixSquare & | x = AMatrixSquare() , |
||
bool | transpose = false |
||
) |
Perform the product: this = t(Y) %*% X %*% Y (T=false) or Y % X %*% t(Y) (T=true)
y | Matrix (possibly rectangular) |
x | Square matrix (optional) |
transpose | transposition flag (T in the description) |
MatrixSquareSymmetric & MatrixSquareSymmetric::operator= | ( | const MatrixSquareSymmetric & | m | ) |
|
static |
Performs the product between a triangular and a square matrix TL is the lower triangular matrix and X is a square matrix
[in] | mode | Type of calculations: 0 : X=TU%*A 1 : X=TL%*A 2 : X=A%*TU 3 : X=A%*TL 4 : X=t(A)%*TU 5 : X=t(A)%*TL |
[in] | neq | number of equations in the system |
[in] | nrhs | number of columns in x |
[in] | tl | Triangular matrix defined by column |
[in] | a | matrix (dimension neq * nrhs) |
int MatrixSquareSymmetric::solveCholesky | ( | const VectorDouble & | b, |
VectorDouble & | x | ||
) |
int MatrixSquareSymmetric::solveCholeskyMat | ( | const MatrixRectangular & | b, |
MatrixRectangular & | x | ||
) |
MatrixSquareSymmetric::DECLARE_TOTL |
Has a specific implementation in the Target language.