28 #ifndef CMatrixTemplate_H
29 #define CMatrixTemplate_H
77 void realloc(
size_t row,
size_t col,
bool newElementsToZero =
false)
82 bool doZeroColumns = newElementsToZero && (col>
m_Cols);
83 size_t sizeZeroColumns =
sizeof(T)*(col-
m_Cols);
95 size_t row_size = col *
sizeof(T);
128 #if defined(_DEBUG)||(MRPT_ALWAYS_CHECKS_DEBUG_MATRICES)
134 for (
size_t r=0;r<
m_Rows;r++)
135 for (
size_t c=0;c<
m_Cols;c++)
164 realloc( cropRowCount, cropColCount );
165 for (
size_t i=0; i <
m_Rows; i++)
166 for (
size_t j=0; j <
m_Cols; j++)
178 template <
typename V,
size_t N>
185 for (
size_t i=0; i <
m_Rows; i++)
186 for (
size_t j=0; j <
m_Cols; j++)
187 m_Val[i][j] = static_cast<T>(theArray[idx++]);
192 template <
typename V>
195 const size_t N = theVector.size();
199 for (
size_t i=0; i <
m_Rows; i++)
200 for (
size_t j=0; j <
m_Cols; j++)
201 m_Val[i][j] = static_cast<T>( *(it++) );
211 for (
size_t i=0; i <
m_Rows; i++)
212 for (
size_t j=0; j <
m_Cols; j++)
227 template <
typename V,
size_t N>
236 for (
size_t i=0; i <
m_Rows; i++)
237 for (
size_t j=0; j <
m_Cols; j++)
238 m_Val[i][j] = static_cast<T>(theArray[idx++]);
262 void setSize(
size_t row,
size_t col,
bool zeroNewElements=
false)
264 realloc(row,col,zeroNewElements);
270 setSize(siz[0],siz[1],zeroNewElements);
277 #if defined(_DEBUG) || (MRPT_ALWAYS_CHECKS_DEBUG_MATRICES)
279 THROW_EXCEPTION(
format(
"Indexes (%lu,%lu) out of range. Matrix is %lux%lu",static_cast<unsigned long>(row),static_cast<unsigned long>(col),static_cast<unsigned long>(
m_Rows),static_cast<unsigned long>(
m_Cols)) );
281 return m_Val[row][col];
288 #if defined(_DEBUG) || (MRPT_ALWAYS_CHECKS_DEBUG_MATRICES)
290 THROW_EXCEPTION(
format(
"Indexes (%lu,%lu) out of range. Matrix is %lux%lu",static_cast<unsigned long>(row),static_cast<unsigned long>(col),static_cast<unsigned long>(
m_Rows),static_cast<unsigned long>(
m_Cols)) );
292 return m_Val[row][col];
300 #if defined(_DEBUG) || (MRPT_ALWAYS_CHECKS_DEBUG_MATRICES)
306 #if defined(_DEBUG) || (MRPT_ALWAYS_CHECKS_DEBUG_MATRICES)
310 return m_Val[0][ith];
315 #if defined(_DEBUG) || (MRPT_ALWAYS_CHECKS_DEBUG_MATRICES)
319 return m_Val[ith][0];
328 #if defined(_DEBUG) || (MRPT_ALWAYS_CHECKS_DEBUG_MATRICES)
334 #if defined(_DEBUG) || (MRPT_ALWAYS_CHECKS_DEBUG_MATRICES)
338 return m_Val[0][ith];
343 #if defined(_DEBUG) || (MRPT_ALWAYS_CHECKS_DEBUG_MATRICES)
347 return m_Val[ith][0];
357 THROW_EXCEPTION(
format(
"Indexes (%lu,%lu) out of range. Matrix is %lux%lu",static_cast<unsigned long>(row),static_cast<unsigned long>(col),static_cast<unsigned long>(
m_Rows),static_cast<unsigned long>(
m_Cols)) );
368 THROW_EXCEPTION(
format(
"Indexes (%lu,%lu) out of range. Matrix is %lux%lu",static_cast<unsigned long>(row),static_cast<unsigned long>(col),static_cast<unsigned long>(
m_Rows),static_cast<unsigned long>(
m_Cols)) );
370 return m_Val[row][col];
379 THROW_EXCEPTION(
format(
"Indexes (%lu,%lu) out of range. Matrix is %lux%lu",static_cast<unsigned long>(row),static_cast<unsigned long>(col),static_cast<unsigned long>(
m_Rows),static_cast<unsigned long>(
m_Cols)) );
381 return m_Val[row][col];
414 size_t nrows=row2-row1+1;
415 size_t ncols=col2-col1+1;
416 if (nrows<=0||ncols<=0) {
422 for (
size_t i=0;i<nrows;i++)
for (
size_t j=0;j<ncols;j++) out.
m_Val[i][j]=
m_Val[i+row1][j+col1];
425 template <
class Derived>
426 void extractSubmatrix(
const size_t row1,
const size_t row2,
const size_t col1,
const size_t col2,Eigen::MatrixBase<Derived> &out)
const
428 size_t nrows=row2-row1+1;
429 size_t ncols=col2-col1+1;
430 if (nrows<=0||ncols<=0) {
431 out =
typename Eigen::MatrixBase<Derived>::PlainObject();
435 out.resize(nrows,ncols);
436 for (
size_t i=0;i<nrows;i++)
for (
size_t j=0;j<ncols;j++) out.coeffRef(i,j)=
m_Val[i+row1][j+col1];
463 void extractCol(
size_t nCol, std::vector<T> &out,
int startingRow = 0)
const
466 #if defined(_DEBUG) || (MRPT_ALWAYS_CHECKS_DEBUG_MATRICES)
475 out[i] =
m_Val[i+startingRow][nCol];
484 #if defined(_DEBUG) || (MRPT_ALWAYS_CHECKS_DEBUG_MATRICES)
493 out(i,0) =
m_Val[i+startingRow][nCol];
529 m_Val[row][i] = in[i];
557 size_t n = in.size();
560 for (
size_t i=0;i<n;i++)
561 m_Val[i][nCol] = in[i];
569 for (
size_t i=0;i<
m_Rows;i++) out.insert(out.end(),&(
m_Val[i][0]),&(
m_Val[i][m_Cols]));