10#define CSparseMatrix_H
25#if MRPT_HAS_SUITESPARSE
29# include <mrpt/otherlibs/CSparse/cs.h>
98 template <
class MATRIX>
101 std::vector<int> row_list, col_list;
102 std::vector<double> content_list;
103 const int nCol = C.getColCount();
104 const int nRow = C.getRowCount();
105 for (
int c=0; c<nCol; ++c)
107 col_list.push_back(row_list.size());
108 for (
int r=0; r<nRow; ++r)
109 if (C.get_unsafe(r,c)!=0)
111 row_list.push_back(r);
112 content_list.push_back(C(r,c));
115 col_list.push_back(row_list.size());
117 sparse_matrix.m = nRow;
118 sparse_matrix.n = nCol;
119 sparse_matrix.nzmax = content_list.size();
120 sparse_matrix.i = (
int*)malloc(
sizeof(
int)*row_list.size());
121 sparse_matrix.p = (
int*)malloc(
sizeof(
int)*col_list.size());
122 sparse_matrix.x = (
double*)malloc(
sizeof(
double)*content_list.size());
124 ::memcpy(sparse_matrix.i, &row_list[0],
sizeof(row_list[0])*row_list.size() );
125 ::memcpy(sparse_matrix.p, &col_list[0],
sizeof(col_list[0])*col_list.size() );
126 ::memcpy(sparse_matrix.x, &content_list[0],
sizeof(content_list[0])*content_list.size() );
128 sparse_matrix.nz = -1;
141 void copy(
const cs *
const sm);
161 template <
typename T>
164 ASSERTMSG_(!data.
empty(),
"Input data must contain at least one non-zero element.")
165 sparse_matrix.i = NULL;
166 sparse_matrix.p = NULL;
167 sparse_matrix.x = NULL;
204 void clear(
const size_t nRows=1,
const size_t nCols=1);
233 this->add_AB(*
this,other);
251 void insert_entry(
const size_t row,
const size_t col,
const double val );
254 inline void insert_entry_fast(
const size_t row,
const size_t col,
const double val ) { insert_entry(row,col,val); }
262 template <
class MATRIX>
265 if (!isTriplet())
THROW_EXCEPTION(
"insert_entry() is only available for sparse matrix in 'triplet' format.")
266 const size_t nR = M.getRowCount();
267 const size_t nC = M.getColCount();
268 for (
size_t r=0;r<nR;r++)
269 for (
size_t c=0;c<nC;c++)
270 insert_entry_fast(row+r,col+c, M.get_unsafe(r,c));
272 sparse_matrix.m = std::max(sparse_matrix.m,
int(row+nR));
273 sparse_matrix.n = std::max(sparse_matrix.n,
int(col+nC));
325 inline void setRowCount(
const size_t nRows) {
ASSERT_(nRows>=(
size_t)sparse_matrix.m); sparse_matrix.m = nRows; }
326 inline void setColCount(
const size_t nCols) {
ASSERT_(nCols>=(
size_t)sparse_matrix.n); sparse_matrix.n = nCols; }
329 inline bool isTriplet()
const {
return sparse_matrix.nz>=0; }
386 template <
class VECTOR>
387 inline VECTOR
backsub(
const VECTOR &b)
const { VECTOR res;
backsub(b,res);
return res; }
390 void backsub(
const Eigen::VectorXd &b, Eigen::VectorXd &result_x)
const;
393 void backsub(
const double *b,
double *result,
const size_t N)
const;
Used in mrpt::math::CSparseMatrix.
CExceptionNotDefPos(const std::string &s)
A numeric matrix of compile-time fixed size.
A matrix of dynamic size.
Auxiliary class to hold the results of a Cholesky factorization of a sparse matrix.
void update(const CSparseMatrix &new_SM)
Update the Cholesky factorization from an updated vesion of the original input, square definite-posit...
void backsub(const double *b, double *result, const size_t N) const
CMatrixDouble get_L() const
Return the L matrix (L*L' = M), as a dense matrix.
CholeskyDecomp(const CSparseMatrix &A)
Constructor from a square definite-positive sparse matrix A, which can be use to solve Ax=b The actua...
void backsub(const Eigen::VectorXd &b, Eigen::VectorXd &result_x) const
Return the vector from a back-substitution step that solves: Ux=b.
csn * m_numeric_structure
virtual ~CholeskyDecomp()
Destructor.
VECTOR backsub(const VECTOR &b) const
Return the vector from a back-substitution step that solves: Ux=b
void get_L(CMatrixDouble &out_L) const
Return the L matrix (L*L' = M), as a dense matrix.
css * m_symbolic_structure
const CSparseMatrix * m_originalSM
A const reference to the original matrix used to build this decomposition.
A sparse matrix structure, wrapping T.
void add_AB(const CSparseMatrix &A, const CSparseMatrix &B)
this = A+B
void compressFromTriplet()
ONLY for TRIPLET matrices: convert the matrix in a column-compressed form.
void setRowCount(const size_t nRows)
Change the number of rows in the matrix (can't be lower than current size)
void construct_from_triplet(const cs &triplet)
Initialization from a triplet "cs", which is first compressed.
void clear(const size_t nRows=1, const size_t nCols=1)
Erase all previous contents and leave the matrix as a "triplet" ROWS x COLS matrix without any nonzer...
bool isColumnCompressed() const
Returns true if this sparse matrix is in "column compressed" form.
void construct_from_existing_cs(const cs &sm)
To be called by constructors only, assume previous pointers are trash and overwrite them.
void internal_free_mem()
free buffers (deallocate the memory of the i,p,x buffers)
CSparseMatrix transpose() const
CSparseMatrix(const size_t nRows=0, const size_t nCols=0)
Create an initially empty sparse matrix, in the "triplet" form.
void get_dense(CMatrixDouble &outMat) const
Return a dense representation of the sparse matrix.
CSparseMatrix(const CSparseMatrixTemplate< T > &data)
A good way to initialize a sparse matrix from a list of non NULL elements.
void construct_from_mrpt_mat(const MATRIX &C)
Initialization from a dense matrix of any kind existing in MRPT.
void setColCount(const size_t nCols)
virtual ~CSparseMatrix()
Destructor.
void copy_fast(cs *const sm)
Fast copy the data from an existing "cs" CSparse data structure, copying the pointers and leaving NUL...
void insert_submatrix(const size_t row, const size_t col, const MATRIX &M)
ONLY for TRIPLET matrices: insert a given matrix (in any of the MRPT formats) at a given location of ...
CSparseMatrix(const CSparseMatrix &other)
Copy constructor.
CSparseMatrix(const cs *const sm)
Copy constructor from an existing "cs" CSparse data structure.
void insert_entry(const size_t row, const size_t col, const double val)
@ Access the matrix, get, set elements, etc.
bool saveToTextFile_dense(const std::string &filName)
save as a dense matrix to a text file
CSparseMatrix(const CMatrixFixedNumeric< T, N, M > &MAT)
Constructor from a dense matrix of any kind existing in MRPT, creating a "column-compressed" sparse m...
void copy(const cs *const sm)
Copy the data from an existing "cs" CSparse data structure.
void multiply_AB(const CSparseMatrix &A, const CSparseMatrix &B)
this = A*B
bool saveToTextFile_sparse(const std::string &filName)
Save sparse structure to a text file loadable from MATLAB (can be called on triplet or CCS matrices).
void insert_entry_fast(const size_t row, const size_t col, const double val)
This was an optimized version, but is now equivalent to insert_entry() due to the need to be compatib...
size_t getColCount() const
CSparseMatrix(const CMatrixTemplateNumeric< T > &MAT)
Constructor from a dense matrix of any kind existing in MRPT, creating a "column-compressed" sparse m...
void swap(CSparseMatrix &other)
Fast swap contents with another sparse matrix.
static void cs2dense(const cs &SM, CMatrixDouble &outMat)
Static method to convert a "cs" structure into a dense representation of the sparse matrix.
size_t getRowCount() const
void multiply_Ab(const mrpt::math::CVectorDouble &b, mrpt::math::CVectorDouble &out_res) const
out_res = this * b
bool isTriplet() const
Returns true if this sparse matrix is in "triplet" form.
A sparse matrix container (with cells of any type), with iterators.
const_iterator begin() const
Returns an iterator which points to the starting point of the matrix.
size_t getRowCount() const
Returns the amount of rows in this matrix.
const_iterator end() const
Returns an iterator which points to the end of the matrix.
size_t getColCount() const
Returns the amount of columns in this matrix.
bool empty() const
Are there no elements set to !=0 ?
SparseMatrixMap::const_iterator const_iterator
Const iterator to move through the matrix.
Column vector, like Eigen::MatrixX*, but automatically initialized to zeros since construction.
The base for MRPT-especific exceptions.
CMRPTException(const std::string &s)
The base class of classes that cannot be copied: compile-time errors will be issued on any copy opera...
EIGEN_STRONG_INLINE void multiply_AB(const MATRIX1 &A, const MATRIX2 &B)
EIGEN_STRONG_INLINE void multiply_Ab(const OTHERVECTOR1 &vIn, OTHERVECTOR2 &vOut, bool accumToOutput=false) const
std::vector< T1 > & operator*=(std::vector< T1 > &a, const std::vector< T2 > &b)
a*=b (element-wise multiplication)
std::vector< T1 > operator*(const std::vector< T1 > &a, const std::vector< T2 > &b)
a*b (element-wise multiplication)
std::vector< T1 > & operator+=(std::vector< T1 > &a, const std::vector< T2 > &b)
a+=b (element-wise sum)
std::vector< T1 > operator+(const std::vector< T1 > &a, const std::vector< T2 > &b)
a+b (element-wise sum)
void BASE_IMPEXP memcpy(void *dest, size_t destSize, const void *src, size_t copyCount) MRPT_NO_THROWS
An OS and compiler independent version of "memcpy".
#define THROW_EXCEPTION(msg)
#define ASSERTMSG_(f, __ERROR_MSG)
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.