9 #ifndef CSparseMatrix_H
10 #define CSparseMatrix_H
24 #if MRPT_HAS_SUITESPARSE
31 #include <mrpt/otherlibs/CSparse/cs.h>
108 template <
class MATRIX>
111 std::vector<int> row_list, col_list;
113 std::vector<double> content_list;
114 const int nCol = C.getColCount();
115 const int nRow = C.getRowCount();
116 for (
int c = 0;
c < nCol; ++
c)
118 col_list.push_back(row_list.size());
119 for (
int r = 0;
r < nRow; ++
r)
120 if (C.get_unsafe(
r,
c) != 0)
122 row_list.push_back(
r);
123 content_list.push_back(C(
r,
c));
126 col_list.push_back(row_list.size());
131 sparse_matrix.i = (
int*)malloc(
sizeof(
int) * row_list.size());
132 sparse_matrix.p = (
int*)malloc(
sizeof(
int) * col_list.size());
133 sparse_matrix.x = (
double*)malloc(
sizeof(
double) * content_list.size());
137 sizeof(row_list[0]) * row_list.size());
140 sizeof(col_list[0]) * col_list.size());
143 sizeof(content_list[0]) * content_list.size());
160 void copy(
const cs*
const sm);
177 CSparseMatrix(
const size_t nRows = 0,
const size_t nCols = 0);
184 template <
typename T>
189 "Input data must contain at least one non-zero element.")
200 it !=
data.end(); ++it)
202 it->first.first, it->first.second, it->second);
213 template <
typename T,
size_t N,
size_t M>
221 template <
typename T>
244 void clear(
const size_t nRows = 1,
const size_t nCols = 1);
281 this->
add_AB(*
this, other);
307 const size_t row,
const size_t col,
const double val)
322 template <
class MATRIX>
324 const size_t row,
const size_t col,
const MATRIX& M)
328 "insert_entry() is only available for sparse matrix in "
330 const size_t nR = M.getRowCount();
331 const size_t nC = M.getColCount();
332 for (
size_t r = 0;
r < nR;
r++)
333 for (
size_t c = 0;
c < nC;
c++)
484 template <
class VECTOR>
494 void backsub(
const Eigen::VectorXd&
b, Eigen::VectorXd& result_x)
const;
498 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.
CMatrixDouble get_L() const
Return the L matrix (L*L' = M), as a dense matrix.
CholeskyDecomp(const CholeskyDecomp &A)=delete
CholeskyDecomp(const CSparseMatrix &A)
Constructor from a square definite-positive sparse matrix A, which can be use to solve Ax=b The actua...
csn * m_numeric_structure
CholeskyDecomp & operator=(const CholeskyDecomp &)=delete
VECTOR backsub(const VECTOR &b) const
Return the vector from a back-substitution step that solves: Ux=b.
void update(const CSparseMatrix &new_SM)
Update the Cholesky factorization from an updated vesion of the original input, square definite-posit...
css * m_symbolic_structure
const CSparseMatrix * m_originalSM
A const reference to the original matrix used to build this decomposition.
virtual ~CholeskyDecomp()
Destructor.
A sparse matrix structure, wrapping T.
virtual ~CSparseMatrix()
Destructor.
void setRowCount(const size_t nRows)
Change the number of rows in the matrix (can't be lower than current size)
bool isColumnCompressed() const
Returns true if this sparse matrix is in "column compressed" form.
void multiply_AB(const CSparseMatrix &A, const CSparseMatrix &B)
this = A*B
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...
void insert_entry(const size_t row, const size_t col, const double val)
@ Access the matrix, get, set elements, etc.
void operator=(const CSparseMatrix &other)
Copy operator from another existing object.
CSparseMatrix operator+(const CSparseMatrix &other) const
void internal_free_mem()
free buffers (deallocate the memory of the i,p,x buffers)
bool saveToTextFile_dense(const std::string &filName)
save as a dense matrix to a text file
static void cs2dense(const cs &SM, CMatrixDouble &outMat)
Static method to convert a "cs" structure into a dense representation of the sparse matrix.
void copy_fast(cs *const sm)
Fast copy the data from an existing "cs" CSparse data structure, copying the pointers and leaving NUL...
void operator*=(const CSparseMatrix &other)
CSparseMatrix(const CSparseMatrixTemplate< T > &data)
A good way to initialize a sparse matrix from a list of non nullptr elements.
void swap(CSparseMatrix &other)
Fast swap contents with another sparse matrix.
void construct_from_mrpt_mat(const MATRIX &C)
Initialization from a dense matrix of any kind existing in MRPT.
void compressFromTriplet()
ONLY for TRIPLET matrices: convert the matrix in a column-compressed form.
void copy(const cs *const sm)
Copy the data from an existing "cs" CSparse data structure.
CSparseMatrix transpose() const
void setColCount(const size_t nCols)
CSparseMatrix operator*(const CSparseMatrix &other) const
void construct_from_existing_cs(const cs &sm)
To be called by constructors only, assume previous pointers are trash and overwrite them.
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 CMatrixFixedNumeric< T, N, M > &MAT)
Constructor from a dense matrix of any kind existing in MRPT, creating a "column-compressed" sparse m...
void add_AB(const CSparseMatrix &A, const CSparseMatrix &B)
this = A+B
void multiply_Ab(const mrpt::math::CVectorDouble &b, mrpt::math::CVectorDouble &out_res) const
out_res = this * b
void construct_from_triplet(const cs &triplet)
Initialization from a triplet "cs", which is first compressed.
void get_dense(CMatrixDouble &outMat) const
Return a dense representation of the sparse matrix.
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...
CSparseMatrix(const size_t nRows=0, const size_t nCols=0)
Create an initially empty sparse matrix, in the "triplet" form.
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...
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).
mrpt::math::CVectorDouble operator*(const mrpt::math::CVectorDouble &other) const
void operator+=(const CSparseMatrix &other)
size_t getRowCount() const
bool isTriplet() const
Returns true if this sparse matrix is in "triplet" form.
A sparse matrix container (with cells of any type), with iterators.
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.
GLenum GLenum GLvoid * row
GLsizei GLsizei GLenum GLenum const GLvoid * data
GLdouble GLdouble GLdouble r
GLsizei const GLfloat * value
GLsizei const GLchar ** string
void memcpy(void *dest, size_t destSize, const void *src, size_t copyCount) noexcept
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.