20 #if MRPT_HAS_SUITESPARSE
27 #include <mrpt/otherlibs/CSparse/cs.h>
101 template <
class MATRIX>
104 std::vector<int> row_list, col_list;
106 std::vector<double> content_list;
107 const int nCol = C.cols();
108 const int nRow = C.rows();
109 for (
int c = 0;
c < nCol; ++
c)
111 col_list.push_back(row_list.size());
112 for (
int r = 0;
r < nRow; ++
r)
113 if (C.get_unsafe(
r,
c) != 0)
115 row_list.push_back(
r);
116 content_list.push_back(C(
r,
c));
119 col_list.push_back(row_list.size());
124 sparse_matrix.i = (
int*)malloc(
sizeof(
int) * row_list.size());
125 sparse_matrix.p = (
int*)malloc(
sizeof(
int) * col_list.size());
126 sparse_matrix.x = (
double*)malloc(
sizeof(
double) * content_list.size());
130 sizeof(row_list[0]) * row_list.size());
133 sizeof(col_list[0]) * col_list.size());
136 sizeof(content_list[0]) * content_list.size());
153 void copy(
const cs*
const sm);
170 CSparseMatrix(
const size_t nRows = 0,
const size_t nCols = 0);
177 template <
typename T>
182 "Input data must contain at least one non-zero element.");
193 it !=
data.end(); ++it)
195 it->first.first, it->first.second, it->second);
206 template <
typename T,
size_t N,
size_t M>
214 template <
typename T>
237 void clear(
const size_t nRows = 1,
const size_t nCols = 1);
274 this->
add_AB(*
this, other);
300 const size_t row,
const size_t col,
const double val)
315 template <
class MATRIX>
317 const size_t row,
const size_t col,
const MATRIX& M)
321 "insert_entry() is only available for sparse matrix in "
323 const size_t nR = M.rows();
324 const size_t nC = M.cols();
325 for (
size_t r = 0;
r < nR;
r++)
326 for (
size_t c = 0;
c < nC;
c++)
477 template <
class VECTOR>
487 void backsub(
const Eigen::VectorXd&
b, Eigen::VectorXd& result_x)
const;
491 void backsub(
const double*
b,
double* result,
const size_t N)
const;
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.
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)
bool isTriplet() const
Returns true if this sparse matrix is in "triplet" form.
A sparse matrix container (with cells of any type), with iterators.
typename SparseMatrixMap::const_iterator const_iterator
Const iterator to move through the matrix.
Column vector, like Eigen::MatrixX*, but automatically initialized to zeros since construction.
#define ASSERT_(f)
Defines an assertion mechanism.
#define THROW_EXCEPTION(msg)
#define ASSERTMSG_(f, __ERROR_MSG)
Defines an assertion mechanism.
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".
This base provides a set of functions for maths stuff.
Used in mrpt::math::CSparseMatrix.
CExceptionNotDefPos(const char *s)