38 typename Scalar,
int NROWS,
int NCOLS,
typename INFO,
bool HAS_REMAP,
39 typename INDEX_REMAP_MAP_IMPL =
55 using col_t = std::map<size_t, TEntry>;
76 if (!HAS_REMAP) assert(
false);
81 if (!HAS_REMAP) assert(
false);
88 const size_t idx =
m_cols.size();
127 const std::string& filename,
const bool force_symmetry =
false,
128 const bool is_col_compressed =
true)
const 131 getAsDense(D, force_symmetry, is_col_compressed);
141 const bool is_col_compressed =
true)
const 143 const size_t nCols =
m_cols.size();
146 if (is_col_compressed)
147 D.
setSize(nRows * NROWS, nCols * NCOLS);
149 D.
setSize(nCols * NROWS, nRows * NCOLS);
151 for (
size_t j = 0; j < nCols; j++)
153 for (
typename col_t::const_iterator itRow =
m_cols[j].
begin();
154 itRow !=
m_cols[j].end(); ++itRow)
156 const size_t row = itRow->first;
157 const size_t row_idx =
158 is_col_compressed ?
row * NROWS : j * NROWS;
159 const size_t col_idx =
160 is_col_compressed ? j * NCOLS :
row * NCOLS;
161 D.
block(row_idx, col_idx, NROWS, NCOLS) = itRow->second.num;
162 if (force_symmetry && row_idx != col_idx)
163 D.
block(col_idx, row_idx, NCOLS, NROWS) =
164 itRow->second.num.transpose();
174 const size_t nCols =
m_cols.size();
175 for (
size_t j = 0; j < nCols; j++)
176 for (
typename col_t::const_iterator itRow =
m_cols[j].
begin();
177 itRow !=
m_cols[j].end(); ++itRow)
185 template <
class MATRIX>
188 const size_t nCols =
m_cols.size();
190 out.setZero(nRows, nCols);
191 for (
size_t j = 0; j < nCols; j++)
192 for (
typename col_t::const_iterator itRow =
m_cols[j].
begin();
193 itRow !=
m_cols[j].end(); ++itRow)
195 const size_t row = itRow->first;
205 const size_t nC = o.
m_cols.size();
210 for (
size_t i = 0; i < nC; i++)
213 for (
typename col_t::const_iterator it = o.
m_cols[i].begin();
214 it != o.
m_cols[i].end(); ++it)
215 m_cols[i][it->first].num = it->second.num;
221 for (
size_t i = 0; i < nC; i++)
225 typename col_t::iterator it_dst =
m_cols[i].begin();
226 typename col_t::const_iterator it_src = o.
m_cols[i].begin();
227 while (it_src != o.
m_cols[i].end())
229 if (it_dst->first < it_src->first)
231 it_dst->second.num.setZero();
234 else if (it_dst->first > it_src->first)
236 m_cols[i][it_src->first].num = it_src->second.num;
241 it_dst->second.num = it_src->second.num;
void getAsDense(mrpt::math::CMatrixDouble &D, const bool force_symmetry=false, const bool is_col_compressed=true) const
Builds a dense representation of the matrix and saves to a text file.
symbolic_t sym
Extra symbolic info.
void getBinaryBlocksRepresentation(MATRIX &out) const
Builds a binary matrix with 1s where an elementary matrix is stored, 0s elsewhere.
const col_t & getCol(const size_t idx) const
col_t & appendCol(const size_t remapIndex)
Append one column, returning a ref to the new col_t data.
void saveToTextFile(const std::string &file, mrpt::math::TMatrixTextFileFormat fileFormat=mrpt::math::MATRIX_FORMAT_ENG, bool appendMRPTHeader=false, const std::string &userHeader=std::string()) const
Saves the vector/matrix to a file compatible with MATLAB/Octave text format.
matrix_t num
Numeric matrix.
void saveToTextFileAsDense(const std::string &filename, const bool force_symmetry=false, const bool is_col_compressed=true) const
Builds a dense representation of the matrix and saves to a text file.
std::deque< col_t > m_cols
-> cols[i]: i'th column.
This base provides a set of functions for maths stuff.
void keep_max(T &var, const K test_val)
If the second argument is above the first one, set the first argument to this higher value...
auto block(int start_row, int start_col)
non-const block(): Returns an Eigen::Block reference to the block
void setColCount(const size_t nCols)
Change the number of columns (keep old contents)
size_t cols() const
Get current number of cols.
const mrpt::containers::map_as_vector< size_t, size_t > & getColInverseRemappedIndices() const
GLsizei const GLchar ** string
A templated column-indexed efficient storage of block-sparse Jacobian or Hessian matrices, together with other arbitrary information.
size_t findCurrentNumberOfRows() const
Goes over all the columns and keep the largest column length.
col_t & getCol(const size_t idx)
void clearColEntries()
Clear all the entries in each column (do not change the number of columns, though!) ...
const_iterator begin() const
const std::vector< size_t > & getColRemappedIndices() const
mrpt::containers::map_as_vector< size_t, size_t > col_inverse_remapped_indices
"remapped index" is the index of some global variable, interpreted by the external user of this class...
void clear()
Clear the contents of this container.
GLenum GLenum GLvoid * row
void setSize(size_t row, size_t col, bool zeroNewElements=false)
Changes the size of matrix, maintaining the previous contents.
void clearAll()
Clear all the entries in each column (do not change the number of columns, though!) ...
void copyNumericalValuesFrom(const MatrixBlockSparseCols< Scalar, NROWS, NCOLS, INFO, HAS_REMAP > &o)
Clear the current contents of this objects and replicates the sparse structure and numerical values o...
std::vector< size_t > col_remapped_indices
void clear()
Clear the contents of this container.
std::map< size_t, TEntry > col_t
Each compressed sparse column.