20 #if MRPT_HAS_SUITESPARSE 21 #define NCOMPLEX // In MRPT we don't need complex numbers, so avoid the 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;
void setColCount(const size_t nCols)
virtual ~CholeskyDecomp()
Destructor.
#define THROW_EXCEPTION(msg)
const CSparseMatrix * m_originalSM
A const reference to the original matrix used to build this decomposition.
Used in mrpt::math::CSparseMatrix.
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...
void construct_from_triplet(const cs &triplet)
Initialization from a triplet "cs", which is first compressed.
Column vector, like Eigen::MatrixX*, but automatically initialized to zeros since construction...
Auxiliary class to hold the results of a Cholesky factorization of a sparse matrix.
A sparse matrix structure, wrapping T.
void compressFromTriplet()
ONLY for TRIPLET matrices: convert the matrix in a column-compressed form.
void construct_from_mrpt_mat(const MATRIX &C)
Initialization from a dense matrix of any kind existing in MRPT.
void swap(CSparseMatrix &other)
Fast swap contents with another sparse matrix.
void insert_entry(const size_t row, const size_t col, const double val)
@ Access the matrix, get, set elements, etc.
A sparse matrix container (with cells of any type), with iterators.
CMatrixDouble get_L() const
Return the L matrix (L*L' = M), as a dense matrix.
void get_dense(CMatrixDouble &outMat) const
Return a dense representation of the sparse matrix.
#define ASSERT_(f)
Defines an assertion mechanism.
A numeric matrix of compile-time fixed size.
CSparseMatrix operator*(const CSparseMatrix &other) const
This base provides a set of functions for maths stuff.
void multiply_AB(const CSparseMatrix &A, const CSparseMatrix &B)
this = A*B
CSparseMatrix(const CMatrixTemplateNumeric< T > &MAT)
Constructor from a dense matrix of any kind existing in MRPT, creating a "column-compressed" sparse m...
void construct_from_existing_cs(const cs &sm)
To be called by constructors only, assume previous pointers are trash and overwrite them...
CSparseMatrix(const size_t nRows=0, const size_t nCols=0)
Create an initially empty sparse matrix, in the "triplet" form.
void add_AB(const CSparseMatrix &A, const CSparseMatrix &B)
this = A+B
void operator=(const CSparseMatrix &other)
Copy operator from another existing object.
#define ASSERTMSG_(f, __ERROR_MSG)
Defines an assertion mechanism.
void multiply_Ab(const mrpt::math::CVectorDouble &b, mrpt::math::CVectorDouble &out_res) const
out_res = this * b
void setRowCount(const size_t nRows)
Change the number of rows in the matrix (can't be lower than current size)
GLsizei const GLchar ** string
CSparseMatrix operator+(const CSparseMatrix &other) const
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 isTriplet() const
Returns true if this sparse matrix is in "triplet" form.
css * m_symbolic_structure
CholeskyDecomp & operator=(const CholeskyDecomp &)=delete
CSparseMatrix(const CMatrixFixedNumeric< T, N, M > &MAT)
Constructor from a dense matrix of any kind existing in MRPT, creating a "column-compressed" sparse m...
GLdouble GLdouble GLdouble r
mrpt::math::CVectorDouble operator*(const mrpt::math::CVectorDouble &other) const
void operator*=(const CSparseMatrix &other)
CholeskyDecomp(const CSparseMatrix &A)
Constructor from a square definite-positive sparse matrix A, which can be use to solve Ax=b The actua...
bool saveToTextFile_dense(const std::string &filName)
save as a dense matrix to a text file
void update(const CSparseMatrix &new_SM)
Update the Cholesky factorization from an updated vesion of the original input, square definite-posit...
GLenum GLenum GLvoid * row
void operator+=(const CSparseMatrix &other)
virtual ~CSparseMatrix()
Destructor.
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 transpose() const
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)...
static void cs2dense(const cs &SM, CMatrixDouble &outMat)
Static method to convert a "cs" structure into a dense representation of the sparse matrix...
A matrix of dynamic size.
csn * m_numeric_structure
GLsizei const GLfloat * value
VECTOR backsub(const VECTOR &b) const
Return the vector from a back-substitution step that solves: Ux=b.
CSparseMatrix(const CSparseMatrixTemplate< T > &data)
A good way to initialize a sparse matrix from a list of non nullptr elements.
CExceptionNotDefPos(const char *s)
bool isColumnCompressed() const
Returns true if this sparse matrix is in "column compressed" form.
void copy(const cs *const sm)
Copy the data from an existing "cs" CSparse data structure.
GLsizei GLsizei GLenum GLenum const GLvoid * data
void copy_fast(cs *const sm)
Fast copy the data from an existing "cs" CSparse data structure, copying the pointers and leaving NUL...
typename SparseMatrixMap::const_iterator const_iterator
Const iterator to move through the matrix.
void internal_free_mem()
free buffers (deallocate the memory of the i,p,x buffers)
void memcpy(void *dest, size_t destSize, const void *src, size_t copyCount) noexcept
An OS and compiler independent version of "memcpy".