class mrpt::math::CMatrixB
Overview
This class is a “CSerializable” wrapper for “CMatrixBool”.
For a complete introduction to Matrices and vectors in MRPT, see: https://www.mrpt.org/Matrices_vectors_arrays_and_Linear_Algebra_MRPT_and_Eigen_classes
#include <mrpt/math/CMatrixB.h> class CMatrixB: public mrpt::serialization::CSerializable, public mrpt::math::CMatrixDynamic { public: // typedefs typedef T value_type; // construction CMatrixB(size_t row = 1, size_t col = 1); CMatrixB(const CMatrixBool& m); // methods T det() const; CMatrixDynamic<T> inverse() const; CMatrixDynamic<T> inverse_LLt() const; int rank(T threshold = 0) const; bool chol(CMatrixDynamic<T>& U) const; bool eig(CMatrixDynamic<T>& eVecs, std::vector<T>& eVals, bool sorted = true) const; bool eig_symmetric(CMatrixDynamic<T>& eVecs, std::vector<T>& eVals, bool sorted = true) const; T maximumDiagonal() const; T minimumDiagonal() const; T trace() const; void unsafeRemoveColumns(const std::vector<std::size_t>& idxs); void removeColumns(const std::vector<std::size_t>& idxsToRemove); void unsafeRemoveRows(const std::vector<std::size_t>& idxs); void removeRows(const std::vector<std::size_t>& idxsToRemove); void insertMatrix(const int row_start, const int col_start, const OTHERMATVEC& submat); void insertMatrixTransposed(const int row_start, const int col_start, const OTHERMATVEC& submat); CMatrixFixed<T, BLOCK_ROWS, BLOCK_COLS> blockCopy(int start_row = 0, int start_col = 0) const; CMatrixDynamic<T> blockCopy(int start_row, int start_col, int BLOCK_ROWS, int BLOCK_COLS) const; void matProductOf_AAt(const MAT_A& A); void matProductOf_AtA(const MAT_A& A); void fill(const Scalar& val); template <int BLOCK_ROWS, int BLOCK_COLS> auto block(int start_row, int start_col); Scalar minCoeff() const; Scalar maxCoeff() const; bool isSquare() const; bool empty() const; Scalar norm_inf() const; Scalar norm() const; Scalar dot(const CVectorDynamic<Scalar>& v) const; void matProductOf_Ab(const CMatrixDynamic<Scalar>& A, const CVectorDynamic<Scalar>& b); void matProductOf_Atb(const CMatrixDynamic<Scalar>& A, const CVectorDynamic<Scalar>& b); Scalar sum() const; Scalar sum_abs() const; std::string asString() const; bool fromMatlabStringFormat(const std::string& s, mrpt::optional_ref<std::ostream> dump_errors_here = std::nullopt); std::string inMatlabFormat(const std::size_t decimal_digits = 6) const; void saveToTextFile( const std::string& file, mrpt::math::TMatrixTextFileFormat fileFormat = mrpt::math::MATRIX_FORMAT_ENG, bool appendMRPTHeader = false, const std::string& userHeader = std::string() ) const; void loadFromTextFile(std::istream& f); void loadFromTextFile(const std::string& file); CMatrixB& operator = (const CMatrixBool& m); void swap(CMatrixDynamic<T>& o); size_type rows() const; size_type cols() const; matrix_size_t size() const; void setSize(size_t row, size_t col, bool zeroNewElements = false); void resize(size_t vectorLen); void resize(const matrix_size_t& siz, bool zeroNewElements = false); const T* data() const; T* data(); T& operator () (size_t row, size_t col); const T& operator () (size_t row, size_t col) const; T& operator [] (size_t ith); const T& operator [] (size_t ith) const; template <typename VECTOR> void appendRow(const VECTOR& in); template <typename VECTOR> void appendCol(const VECTOR& in); template <typename VECTOR> void asVector(VECTOR& out) const; template < typename EIGEN_MATRIX = eigen_t, typename EIGEN_MAP = Eigen::Map<EIGEN_MATRIX, MRPT_MAX_ALIGN_BYTES, Eigen::InnerStride<1>> > EIGEN_MAP asEigen(); CVectorDynamic<Scalar> llt_solve(const CVectorDynamic<Scalar>& b) const; CVectorDynamic<Scalar> lu_solve(const CVectorDynamic<Scalar>& b) const; void setDiagonal(const std::size_t N, const T value); void setDiagonal(const T value); void setDiagonal(const std::vector<T>& diags); void matProductOf_AB(const CMatrixDynamic<T>& A, const CMatrixDynamic<T>& B); };
Inherited Members
public: // methods void setConstant(const Scalar value); void setConstant(size_t nrows, size_t ncols, const Scalar value); void setConstant(size_t nrows, const Scalar value); void assign(const std::size_t N, const Scalar value); void setZero(); void setZero(size_t nrows, size_t ncols); void setZero(size_t nrows); static Derived Constant(const Scalar value); static Derived Constant(size_t nrows, size_t ncols, const Scalar value); static Derived Zero(); static Derived Zero(size_t nrows, size_t ncols); auto block(int start_row, int start_col, int BLOCK_ROWS, int BLOCK_COLS); auto block(int start_row, int start_col, int BLOCK_ROWS, int BLOCK_COLS) const; auto transpose(); auto transpose() const; auto array(); auto array() const; auto operator - () const; template <typename S2, class D2> auto operator + (const MatrixVectorBase<S2, D2>& m2) const; template <typename S2, class D2> void operator += (const MatrixVectorBase<S2, D2>& m2); template <typename S2, class D2> auto operator - (const MatrixVectorBase<S2, D2>& m2) const; template <typename S2, class D2> void operator -= (const MatrixVectorBase<S2, D2>& m2); template <typename S2, class D2> auto operator * (const MatrixVectorBase<S2, D2>& m2) const; auto operator * (const Scalar s) const; template <int N> CMatrixFixed<Scalar, N, 1> tail() const; template <int N> CMatrixFixed<Scalar, N, 1> head() const; Scalar& coeffRef(int r, int c); const Scalar& coeff(int r, int c) const; Scalar minCoeff(std::size_t& outIndexOfMin) const; Scalar minCoeff(std::size_t& rowIdx, std::size_t& colIdx) const; Scalar maxCoeff(std::size_t& outIndexOfMax) const; Scalar maxCoeff(std::size_t& rowIdx, std::size_t& colIdx) const; void operator += (Scalar s); void operator -= (Scalar s); void operator *= (Scalar s); CMatrixDynamic<Scalar> operator * (const CMatrixDynamic<Scalar>& v); Derived operator + (const Derived& m2) const; void operator += (const Derived& m2); Derived operator - (const Derived& m2) const; void operator -= (const Derived& m2); Derived operator * (const Derived& m2) const; Scalar dot(const MatrixVectorBase<Scalar, Derived>& v) const; template <typename OTHERMATVEC> bool operator == (const OTHERMATVEC& o) const; template <typename OTHERMATVEC> bool operator != (const OTHERMATVEC& o) const; Derived& mvbDerived(); const Derived& mvbDerived() const; auto col(int colIdx); auto col(int colIdx) const; auto row(int rowIdx); auto row(int rowIdx) const; template <typename VECTOR_LIKE> void extractRow(int rowIdx, VECTOR_LIKE& v) const; template <typename VECTOR_LIKE> VECTOR_LIKE extractRow(int rowIdx) const; template <typename VECTOR_LIKE> void extractColumn(int colIdx, VECTOR_LIKE& v) const; template <typename VECTOR_LIKE> VECTOR_LIKE extractColumn(int colIdx) const; template <int BLOCK_ROWS, int BLOCK_COLS> CMatrixFixed<Scalar, BLOCK_ROWS, BLOCK_COLS> extractMatrix( const int start_row = 0, const int start_col = 0 ) const; CMatrixDynamic<Scalar> extractMatrix( const int BLOCK_ROWS, const int BLOCK_COLS, const int start_row, const int start_col ) const; Derived& mbDerived(); const Derived& mbDerived() const; void setIdentity(); void setIdentity(const std::size_t N); static Derived Identity(); static Derived Identity(const std::size_t N); CMatrixDynamic& operator = (const CMatrixDynamic<T>& m); template <typename U> CMatrixDynamic& operator = (const CMatrixDynamic<U>& m); template <class Derived> CMatrixDynamic& operator = (const Eigen::MatrixBase<Derived>& m); template <std::size_t ROWS, std::size_t COLS> CMatrixDynamic& operator = (const CMatrixFixed<T, ROWS, COLS>& m); template <typename V, size_t N> CMatrixDynamic& operator = (V(&) theArray [N]); CMatrixDynamic& operator = (CMatrixDynamic&& m);
Typedefs
typedef T value_type
The type of the matrix elements.
Construction
CMatrixB(size_t row = 1, size_t col = 1)
Constructor.
CMatrixB(const CMatrixBool& m)
Copy constructor.
Methods
T det() const
Determinant of matrix.
CMatrixDynamic<T> inverse() const
Returns the inverse of a general matrix using LU.
CMatrixDynamic<T> inverse_LLt() const
Returns the inverse of a symmetric matrix using LLt.
int rank(T threshold = 0) const
Finds the rank of the matrix via LU decomposition.
Uses Eigen’s default threshold unless threshold>0
.
bool chol(CMatrixDynamic<T>& U) const
Cholesky M=U T * U decomposition for symmetric matrix (upper-half of the matrix is actually ignored.
Returns:
false if Cholesky fails
bool eig(CMatrixDynamic<T>& eVecs, std::vector<T>& eVals, bool sorted = true) const
Computes the eigenvectors and eigenvalues for a square, general matrix.
Use eig_symmetric() for symmetric matrices for better accuracy and performance. Eigenvectors are the columns of the returned matrix, and their order matches that of returned eigenvalues.
Parameters:
sorted |
If true, eigenvalues (and eigenvectors) will be sorted in ascending order. |
eVecs |
The container where eigenvectors will be stored. |
eVals |
The container where eigenvalues will be stored. |
Returns:
false if eigenvalues could not be determined.
bool eig_symmetric(CMatrixDynamic<T>& eVecs, std::vector<T>& eVals, bool sorted = true) const
Read: eig()
This only uses the lower-triangular part of the matrix
(Since MRPT 2.5.2) If sorted==true, the smallest eigenvalue is checked to be non-negative, and resetted to zero if found to be negative due to rounding errors in the internal Eigen3 routines.
T maximumDiagonal() const
Returns the maximum value in the diagonal.
T minimumDiagonal() const
Returns the minimum value in the diagonal.
T trace() const
Returns the trace of the matrix (not necessarily square).
void unsafeRemoveColumns(const std::vector<std::size_t>& idxs)
Removes columns of the matrix.
This “unsafe” version assumes indices sorted in ascending order.
void removeColumns(const std::vector<std::size_t>& idxsToRemove)
Removes columns of the matrix.
Indices may be unsorted and duplicated
void unsafeRemoveRows(const std::vector<std::size_t>& idxs)
Removes rows of the matrix.
This “unsafe” version assumes indices sorted in ascending order.
void removeRows(const std::vector<std::size_t>& idxsToRemove)
Removes rows of the matrix.
Indices may be unsorted and duplicated
void insertMatrix( const int row_start, const int col_start, const OTHERMATVEC& submat )
Copies the given input submatrix/vector into this matrix/vector, starting at the given top-left coordinates.
void insertMatrixTransposed( const int row_start, const int col_start, const OTHERMATVEC& submat )
Like insertMatrix(), but inserts submat ` (transposed)
CMatrixFixed<T, BLOCK_ROWS, BLOCK_COLS> blockCopy(int start_row = 0, int start_col = 0) const
const blockCopy() : Returns a copy of the given block
CMatrixDynamic<T> blockCopy(int start_row, int start_col, int BLOCK_ROWS, int BLOCK_COLS) const
const blockCopy() : Returns a copy of the given block (non templated version, dynamic sizes)
void matProductOf_AAt(const MAT_A& A)
this = A * A T
void matProductOf_AtA(const MAT_A& A)
this = A T * A
void fill(const Scalar& val)
Fill all the elements with a given value (Note: named “fillAll” since “fill” will be used by child classes)
template <int BLOCK_ROWS, int BLOCK_COLS> auto block( int start_row, int start_col )
non-const block() : Returns an Eigen::Block reference to the block
Scalar minCoeff() const
Minimum value in the matrix/vector.
Scalar maxCoeff() const
Maximum value in the matrix/vector.
bool isSquare() const
returns true if matrix is NxN
bool empty() const
returns true if matrix/vector has size=0
Scalar norm_inf() const
Compute the norm-infinite of a vector (.
), ie the maximum absolute value of the elements.
Scalar norm() const
Compute the L2 norm of a vector/array/matrix (the Euclidean distance to the origin, taking all the elements as a single vector).
See also:
Scalar dot(const CVectorDynamic<Scalar>& v) const
dot product of this \cdot v
void matProductOf_Ab(const CMatrixDynamic<Scalar>& A, const CVectorDynamic<Scalar>& b)
this = A * b , with A
and b
a dynamic matrix & vector
void matProductOf_Atb(const CMatrixDynamic<Scalar>& A, const CVectorDynamic<Scalar>& b)
this = A T * b , with A
and b
a dynamic matrix & vector
Scalar sum() const
Sum of all elements in matrix/vector.
Scalar sum_abs() const
Sum of the absolute value of all elements in matrix/vector.
std::string asString() const
Returns a string representation of the vector/matrix, using Eigen’s default settings.
bool fromMatlabStringFormat( const std::string& s, mrpt::optional_ref<std::ostream> dump_errors_here = std::nullopt )
Reads a matrix from a string in Matlab-like format, for example: “[1 0 2; 0 4 -1]” The string must start with ‘[’ and end with ‘]’.
Rows are separated by semicolons ‘;’ and columns in each row by one or more whitespaces ‘ ‘ or tabs ‘t’. Commas ‘,’ between elements are NOT allowed.
This format is also used for CConfigFile::read_matrix.
Returns:
true on success. false if the string is malformed, and then the matrix will be resized to 0x0.
See also:
inMatlabFormat, CConfigFile::read_matrix
std::string inMatlabFormat(const std::size_t decimal_digits = 6) const
Exports the matrix as a string compatible with Matlab/Octave.
See also:
void saveToTextFile( const std::string& file, mrpt::math::TMatrixTextFileFormat fileFormat = mrpt::math::MATRIX_FORMAT_ENG, bool appendMRPTHeader = false, const std::string& userHeader = std::string() ) const
Saves the vector/matrix to a file compatible with MATLAB/Octave text format.
Parameters:
file |
The target filename. |
fileFormat |
See TMatrixTextFileFormat. The format of the numbers in the text file. |
appendMRPTHeader |
Insert this header to the file “% File generated by MRPT. Load with MATLAB with: VAR=load(FILENAME);” |
userHeader |
Additional text to be written at the head of the file. Typically MALAB comments “% This file blah blah”. Final end-of-line is not needed. |
See also:
loadFromTextFile, CMatrixDynamic::inMatlabFormat, SAVE_MATRIX
void loadFromTextFile(std::istream& f)
Loads a vector/matrix from a text file, compatible with MATLAB text format.
Lines starting with ‘’ or ‘#’ are interpreted as comments and ignored.
Parameters:
std::runtime_error |
On format error. |
See also:
saveToTextFile, fromMatlabStringFormat
void loadFromTextFile(const std::string& file)
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.
CMatrixB& operator = (const CMatrixBool& m)
Assignment operator for float matrixes.
void swap(CMatrixDynamic<T>& o)
Swap with another matrix very efficiently (just swaps a pointer and two integer values).
size_type rows() const
Number of rows in the matrix.
See also:
size_type cols() const
Number of columns in the matrix.
See also:
matrix_size_t size() const
Get a 2-vector with [NROWS NCOLS] (as in MATLAB command size(x))
void setSize(size_t row, size_t col, bool zeroNewElements = false)
Changes the size of matrix, maintaining the previous contents.
void resize(size_t vectorLen)
Resizes as a Nx1 vector.
void resize(const matrix_size_t& siz, bool zeroNewElements = false)
Resize the matrix.
const T* data() const
Return raw pointer to row-major data buffer.
All matrix cells can be assumed to be stored contiguously in memory, i.e. row stride = column count.
T* data()
This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts.
T& operator () (size_t row, size_t col)
Subscript operator to get/set individual elements.
const T& operator () (size_t row, size_t col) const
Subscript operator to get individual elements.
T& operator [] (size_t ith)
Subscript operator to get/set an individual element from a row or column matrix.
Parameters:
std::exception |
If the object is not a column or row matrix. |
const T& operator [] (size_t ith) const
Subscript operator to get/set an individual element from a row or column matrix.
For non-vectors (NxM matrices), it returns the i-th matrix element, in RowMajor order.
Parameters:
std::exception |
If the object is not a column or row matrix. |
template <typename VECTOR> void appendRow(const VECTOR& in)
Appends a new row to the MxN matrix from a 1xN vector.
The length of the vector must match the width of the matrix, unless it’s empty: in that case the matrix is resized to 1xN.
CMatrixDouble M(0,0); CVectorDouble v(7),w(7); // ... M.appendRow(v); M.appendRow(w);
Parameters:
std::exception |
On incorrect vector length. |
See also:
template <typename VECTOR> void appendCol(const VECTOR& in)
Appends a new column to the matrix from a vector.
The length of the vector must match the number of rows of the matrix, unless it is (0,0).
Parameters:
std::exception |
On size mismatch. |
See also:
extractCol
template <typename VECTOR> void asVector(VECTOR& out) const
Returns a vector containing the matrix’s values.
template < typename EIGEN_MATRIX = eigen_t, typename EIGEN_MAP = Eigen::Map<EIGEN_MATRIX, MRPT_MAX_ALIGN_BYTES, Eigen::InnerStride<1>> > EIGEN_MAP asEigen()
Get as an Eigen-compatible Eigen::Map object
CVectorDynamic<Scalar> llt_solve(const CVectorDynamic<Scalar>& b) const
Solves the linear system Ax=b, returns x, with A this symmetric matrix.
See also:
CVectorDynamic<Scalar> lu_solve(const CVectorDynamic<Scalar>& b) const
Solves the linear system Ax=b, returns x, with A this asymmetric matrix.
See also:
void setDiagonal(const std::size_t N, const T value)
Resize to NxN, set all entries to zero, except the main diagonal which is set to value
void setDiagonal(const T value)
Set all entries to zero, except the main diagonal which is set to value
void setDiagonal(const std::vector<T>& diags)
Resizes to NxN, with N the length of the input vector, set all entries to zero, except the main diagonal which is set to values in the vector.
void matProductOf_AB(const CMatrixDynamic<T>& A, const CMatrixDynamic<T>& B)
this = A*B, with A & B of the same type of this.
For products of different matrix types, use the regular * operator (which requires the <Eigen/Dense>
header)