58 typename SparseMatrixMap::const_reverse_iterator;
84 auto it =
objectList.find(std::make_pair(r, c));
93 inline bool exists(
size_t r,
size_t c)
const 95 #if defined(_DEBUG) || (MRPT_ALWAYS_CHECKS_DEBUG_MATRICES) 96 if (r >=
mRows || c >=
mColumns)
throw std::logic_error(
"Out of range");
106 #if defined(_DEBUG) || (MRPT_ALWAYS_CHECKS_DEBUG_MATRICES) 107 if (r >=
mRows || c >=
mColumns)
throw std::logic_error(
"Out of range");
126 template <
typename VECTOR>
127 void getRow(
size_t nRow, VECTOR& vec)
const 129 #if defined(_DEBUG) || (MRPT_ALWAYS_CHECKS_DEBUG_MATRICES) 130 if (nRow >=
mRows)
throw std::logic_error(
"Out of range");
133 size_t nextIndex = 0;
134 for (
typename SparseMatrixMap::const_iterator it =
objectList.begin();
137 const std::pair<size_t, size_t>& index = it->first;
138 if (index.first < nRow)
140 else if (index.first == nRow)
142 for (
size_t i = nextIndex; i < index.second; i++) vec[i] = T();
143 vec[index.second] = it->second;
144 nextIndex = index.second + 1;
148 for (
size_t i = nextIndex; i <
mColumns; i++) vec[i] = T();
158 template <
typename VECTOR>
161 #if defined(_DEBUG) || (MRPT_ALWAYS_CHECKS_DEBUG_MATRICES) 162 if (nCol >=
mColumns)
throw std::logic_error(
"Out of range");
165 size_t nextIndex = 0;
166 for (
typename SparseMatrixMap::const_iterator it =
objectList.begin();
169 const std::pair<size_t, size_t>& index = it->first;
170 if (index.second == nCol)
172 for (
size_t i = nextIndex; i < index.first; i++) vec[i] = T();
173 vec[index.first] = it->second;
174 nextIndex = index.first + 1;
177 for (
size_t i = nextIndex; i <
mRows; i++) vec[i] = T();
183 inline void insert(
size_t row,
size_t column,
const T& obj)
189 template <
class MATRIX_LIKE>
190 inline void insertMatrix(
size_t row,
size_t column,
const MATRIX_LIKE& mat)
192 for (
size_t nr = 0; nr < mat.rows(); nr++)
193 for (
size_t nc = 0; nc < mat.cols(); nc++)
194 operator()(row + nr, column + nc) = mat(nr, nc);
235 template <
typename VECTOR>
236 void setRow(
size_t nRow,
const VECTOR& vec,
const T& nullObject = T())
238 #if defined(_DEBUG) || (MRPT_ALWAYS_CHECKS_DEBUG_MATRICES) 239 if (nRow >=
mRows)
throw std::logic_error(
"Out of range");
241 size_t N = vec.size();
242 if (N !=
mColumns)
throw std::logic_error(
"Wrong-sized vector");
243 for (
size_t i = 0; i < N; i++)
245 const T& obj = vec[i];
246 std::pair<size_t, size_t> index = std::make_pair(nRow, i);
247 if (obj == nullObject)
260 template <
typename VECTOR>
261 void setColumn(
size_t nCol,
const VECTOR& vec,
const T& nullObject = T())
263 #if defined(_DEBUG) || (MRPT_ALWAYS_CHECKS_DEBUG_MATRICES) 264 if (nCol >=
mColumns)
throw std::logic_error(
"Out of range");
266 size_t N = vec.size();
267 if (N !=
mRows)
throw std::logic_error(
"Wrong-sized vector");
268 for (
size_t i = 0; i < N; i++)
270 const T& obj = vec[i];
271 std::pair<size_t, size_t> index = std::make_pair(i, nCol);
272 if (obj == nullObject)
288 std::vector<std::pair<size_t, size_t>> toErase;
291 const std::pair<size_t, size_t>& i = it->first;
292 if (i.first >= nRows || i.second >= nCols)
293 toErase.push_back(it->first);
295 for (
auto it = toErase.begin(); it != toErase.end(); ++it)
304 size_t firstRow,
size_t lastRow,
size_t firstColumn,
305 size_t lastColumn)
const 307 #if defined(_DEBUG) || (MRPT_ALWAYS_CHECKS_DEBUG_MATRICES) 309 throw std::logic_error(
"Out of range");
310 if (firstRow > lastRow || firstColumn > lastColumn)
311 throw std::logic_error(
"Invalid size");
314 lastRow + 1 - firstRow, lastColumn + 1 - firstColumn);
315 for (
typename SparseMatrixMap::const_iterator it =
begin(); it !=
end();
318 const std::pair<size_t, size_t>& i = it->first;
319 if (i.first >= firstRow && i.first <= lastRow &&
320 i.second >= firstColumn && i.second <= lastColumn)
321 res(i.first - firstRow, i.second - firstColumn) = it->second;
329 template <
typename VECTOR>
337 vec.push_back(it->second);
361 inline bool isNull(
size_t nRow,
size_t nCol)
const 364 throw std::logic_error(
"Out of range");
365 return objectList.count(std::make_pair(nRow, nCol)) == 0;
374 throw std::logic_error(
"Out of range");
375 return objectList.count(std::make_pair(nRow, nCol)) > 0;
387 std::vector<std::pair<size_t, size_t>> nulls;
389 if (it->second == nullObject) nulls.push_back(it->first);
390 for (
auto it = nulls.begin(); it != nulls.end(); ++it)
424 if (c < r) std::swap(r, c);
434 if (c < r) std::swap(r, c);
437 throw std::logic_error(
"Out of range");
void insertMatrix(size_t row, size_t column, const MATRIX_LIKE &mat)
Inserts submatrix at a given location.
const_iterator begin() const
Returns an iterator which points to the starting point of the matrix.
bool isNotNull(size_t nRow, size_t nCol) const
Checks whether an element of the matrix is not the default object.
size_t getNullElements() const
Gets the amount of null elements inside the matrix.
size_t getNonNullElements() const
Gets the amount of non-null elements inside the matrix.
typename SparseMatrixMap::const_reverse_iterator const_reverse_iterator
Const reverse iterator to move through the matrix.
void getRow(size_t nRow, VECTOR &vec) const
Extracts a full row from the matrix.
void insert(size_t row, size_t column, const T &obj)
Inserts an element into the matrix.
T & operator()(size_t r, size_t c)
Reference access operator.
CSparseSymmetricalMatrix(const CSparseSymmetricalMatrix &o)
A sparse matrix container (with cells of any type), with iterators.
bool empty() const
Are there no elements set to !=0 ?
void purge(T nullObject=T())
Checks each non-null elements against the basic objects, erasing unnecesary references to it...
CSparseMatrixTemplate(size_t nR, size_t nC)
Constructor with default size.
This base provides a set of functions for maths stuff.
void asVector(VECTOR &vec) const
Gets a vector containing all the elements of the matrix, ignoring their position. ...
T operator()(size_t r, size_t c) const
Element access operator.
size_t cols() const
Returns the amount of columns in this matrix.
typename std::map< std::pair< size_t, size_t >, T > SparseMatrixMap
Internal map type, used to store the actual matrix.
size_t rows() const
Returns the amount of rows in this matrix.
CSparseMatrixTemplate()=default
Basic constructor with no data.
size_t mRows
Size of the matrix.
const_reverse_iterator rend() const
Returns an iterator which points to the starting point of the matrix, although it's the upper limit o...
void clear()
Completely removes all elements, although maintaining the matrix's size.
CSparseSymmetricalMatrix(const CSparseMatrixTemplate< T > &o)
const_iterator end() const
Returns an iterator which points to the end of the matrix.
bool isNull(size_t nRow, size_t nCol) const
Checks whether an element of the matrix is the default object.
CSparseSymmetricalMatrix()
T operator()(size_t r, size_t c) const
CSparseMatrixTemplate< T > operator()(size_t firstRow, size_t lastRow, size_t firstColumn, size_t lastColumn) const
Extracts a submatrix form the matrix.
void setRow(size_t nRow, const VECTOR &vec, const T &nullObject=T())
Inserts a full row into the matrix.
SparseMatrixMap objectList
Actual matrix.
void resize(size_t nRows, size_t nCols)
Changes the size of the matrix.
virtual ~CSparseSymmetricalMatrix()=default
void getColumn(size_t nCol, VECTOR &vec) const
Extracts a full column from the matrix.
bool exists(size_t r, size_t c) const
Element access operator.
void setColumn(size_t nCol, const VECTOR &vec, const T &nullObject=T())
Inserts a full column into the matrix.
void resize(size_t matrixSize)
const_reverse_iterator rbegin() const
Returns an iterator which points to the end of the matrix, and can be used to move backwards...
typename SparseMatrixMap::const_iterator const_iterator
Const iterator to move through the matrix.
T & operator()(size_t r, size_t c)
A sparse matrix container for square symmetrical content around the main diagonal.