9 #ifndef CSparseMatrix_H    10 #define CSparseMatrix_H    25 #if MRPT_HAS_SUITESPARSE    26 #       define NCOMPLEX    // In MRPT we don't need complex numbers, so avoid the annoying warning: 'cs_ci_house' has C-linkage specified, but returns UDT 'std::complex<double>' which is incompatible with C    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;  
   132                         void construct_from_triplet(
const cs & triplet);
   135                         void construct_from_existing_cs(
const cs &sm);
   138                         void internal_free_mem();
   141                         void  copy(
const cs  * 
const sm);
   144                         void  copy_fast(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;
   176                                 construct_from_triplet(triplet.sparse_matrix);
   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 );
   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));
   280                         void compressFromTriplet();
   293                         bool saveToTextFile_dense(
const std::string &filName);
   318                         bool saveToTextFile_sparse(
const std::string &filName);
   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>
   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;
 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". 
 
EIGEN_STRONG_INLINE void multiply_Ab(const OTHERVECTOR1 &vIn, OTHERVECTOR2 &vOut, bool accumToOutput=false) const
 
void setColCount(const size_t nCols)
 
size_t getRowCount() const
 
const CSparseMatrix * m_originalSM
A const reference to the original matrix used to build this decomposition. 
 
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...
 
#define THROW_EXCEPTION(msg)
 
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 construct_from_mrpt_mat(const MATRIX &C)
Initialization from a dense matrix of any kind existing in MRPT. 
 
SparseMatrixMap::const_iterator const_iterator
Const iterator to move through the matrix. 
 
CExceptionNotDefPos(const std::string &s)
 
void clear()
Clear the contents of this container. 
 
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. 
 
Used in mrpt::math::CSparseMatrix. 
 
std::vector< T1 > operator+(const std::vector< T1 > &a, const std::vector< T2 > &b)
a+b (element-wise sum) 
 
A numeric matrix of compile-time fixed size. 
 
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...
 
std::vector< T1 > & operator+=(std::vector< T1 > &a, const std::vector< T2 > &b)
a+=b (element-wise sum) 
 
void add_AB(const CSparseMatrix &A, const CSparseMatrix &B)
this = A+B 
 
EIGEN_STRONG_INLINE void multiply_AB(const MATRIX1 &A, const MATRIX2 &B)
 
The base class of classes that cannot be copied: compile-time errors will be issued on any copy opera...
 
The base for MRPT-especific exceptions. 
 
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
 
bool isTriplet() const
Returns true if this sparse matrix is in "triplet" form. 
 
GLsizei GLboolean transpose
 
css * m_symbolic_structure
 
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries. 
 
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
 
GLenum GLenum GLvoid * row
 
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 ...
 
A matrix of dynamic size. 
 
CMRPTException(const std::string &s)
 
csn * m_numeric_structure
 
size_t getColCount() const
 
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 NULL elements. 
 
bool isColumnCompressed() const
Returns true if this sparse matrix is in "column compressed" form. 
 
#define ASSERTMSG_(f, __ERROR_MSG)
 
GLsizei GLsizei GLenum GLenum const GLvoid * data
 
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)