11 #include <mrpt/config.h> 23 #if MRPT_HAS_SUITESPARSE 24 #define NCOMPLEX // In MRPT we don't need complex numbers, so avoid the 30 #include <mrpt/otherlibs/CSparse/cs.h> 104 template <
class MATRIX>
107 std::vector<int> row_list, col_list;
109 std::vector<double> content_list;
110 const int nCol = C.cols();
111 const int nRow = C.rows();
112 for (
int c = 0;
c < nCol; ++
c)
114 col_list.push_back(row_list.size());
115 for (
int r = 0;
r < nRow; ++
r)
118 row_list.push_back(
r);
119 content_list.push_back(C(
r,
c));
122 col_list.push_back(row_list.size());
127 sparse_matrix.i = (
int*)malloc(
sizeof(
int) * row_list.size());
128 sparse_matrix.p = (
int*)malloc(
sizeof(
int) * col_list.size());
129 sparse_matrix.x = (
double*)malloc(
sizeof(
double) * content_list.size());
133 sizeof(row_list[0]) * row_list.size());
136 sizeof(col_list[0]) * col_list.size());
139 sizeof(content_list[0]) * content_list.size());
156 void copy(
const cs*
const sm);
173 CSparseMatrix(
const size_t nRows = 0,
const size_t nCols = 0);
180 template <
typename T>
185 "Input data must contain at least one non-zero element.");
194 for (
auto it =
data.begin(); it !=
data.end(); ++it)
196 it->first.first, it->first.second, it->second);
207 template <
typename T,
size_t N,
size_t M>
215 template <
typename T>
238 void clear(
const size_t nRows = 1,
const size_t nCols = 1);
275 this->
add_AB(*
this, other);
301 const size_t row,
const size_t col,
const double val)
316 template <
class MATRIX>
318 const size_t row,
const size_t col,
const MATRIX& M)
322 "insert_entry() is only available for sparse matrix in " 323 "'triplet' format.");
324 const size_t nR = M.rows();
325 const size_t nC = M.cols();
326 for (
size_t r = 0;
r < nR;
r++)
327 for (
size_t c = 0;
c < nC;
c++)
478 template <
class VECTOR>
492 void backsub(
const double*
b,
double* result,
const size_t N)
const;
502 !std::is_copy_constructible_v<CholeskyDecomp> &&
503 !std::is_copy_assignable_v<CholeskyDecomp>,
A compile-time fixed-size numeric matrix container.
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.
CSparseMatrix(const CMatrixDynamic< T > &MAT)
Constructor from a dense matrix of any kind existing in MRPT, creating a "column-compressed" sparse m...
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.
CSparseMatrix operator*(const CSparseMatrix &other) const
This base provides a set of functions for maths stuff.
CSparseMatrix(const CMatrixFixed< T, N, M > &MAT)
Constructor from a dense matrix of any kind existing in MRPT, creating a "column-compressed" sparse m...
void multiply_AB(const CSparseMatrix &A, const CSparseMatrix &B)
this = A*B
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 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...
void matProductOf_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.
css * m_symbolic_structure
CholeskyDecomp & operator=(const CholeskyDecomp &)=delete
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...
csn * m_numeric_structure
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.
This template class provides the basic functionality for a general 2D any-size, resizable container o...
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...
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".