22 template <
typename Scalar,
class Derived>
26 Derived&
mbDerived() {
return static_cast<Derived&
>(*this); }
29 return static_cast<const Derived&
>(*this);
37 for (
typename Derived::Index
r = 0;
r <
mbDerived().rows();
r++)
38 for (
typename Derived::Index
c = 0;
c <
mbDerived().cols();
c++)
53 const std::size_t N = diags.size();
55 for (std::size_t i = 0; i < N; i++)
mbDerived()(i, i) = diags[i];
67 Derived::RowsAtCompileTime > 0 && Derived::ColsAtCompileTime > 0,
68 "Identity() without arguments can be used only for fixed-size " 91 internalAssertEigenDefined<Derived>();
94 auto col(
int colIdx)
const 96 internalAssertEigenDefined<Derived>();
102 internalAssertEigenDefined<Derived>();
103 return mbDerived().asEigen().row(rowIdx);
105 auto row(
int rowIdx)
const 107 internalAssertEigenDefined<Derived>();
108 return mbDerived().asEigen().row(rowIdx);
111 template <
typename VECTOR_LIKE>
116 for (
typename Derived::Index i = 0; i <
mbDerived().cols(); i++)
119 template <
typename VECTOR_LIKE>
127 template <
typename VECTOR_LIKE>
132 for (
typename Derived::Index i = 0; i <
mbDerived().rows(); i++)
135 template <
typename VECTOR_LIKE>
164 bool chol(Derived& U)
const;
178 Derived& eVecs, std::vector<Scalar>& eVals,
bool sorted =
true)
const;
183 Derived& eVecs, std::vector<Scalar>& eVals,
bool sorted =
true)
const;
198 void removeColumns(
const std::vector<std::size_t>& idxsToRemove);
205 void removeRows(
const std::vector<std::size_t>& idxsToRemove);
209 template <
typename OTHERMATVEC>
211 const int row_start,
const int col_start,
const OTHERMATVEC& submat)
215 for (
int r = 0;
r < submat.rows();
r++)
216 for (
int c = 0;
c < submat.cols();
c++)
220 template <
typename OTHERMATVEC>
222 const int row_start,
const int col_start,
const OTHERMATVEC& submat)
226 for (
int r = 0;
r < submat.cols();
r++)
227 for (
int c = 0;
c < submat.rows();
c++)
231 template <
int BLOCK_ROWS,
int BLOCK_COLS>
233 const int start_row = 0,
const int start_col = 0)
const 239 for (
int r = 0;
r < BLOCK_ROWS;
r++)
240 for (
int c = 0;
c < BLOCK_COLS;
c++)
246 const int BLOCK_ROWS,
const int BLOCK_COLS,
const int start_row,
247 const int start_col)
const 253 for (
int r = 0;
r < BLOCK_ROWS;
r++)
254 for (
int c = 0;
c < BLOCK_COLS;
c++)
260 template <
typename MAT_A>
263 using Index =
typename Derived::Index;
264 const auto N =
A.rows(), Ninner =
A.cols();
266 for (Index
r = 0;
r < N;
r++)
269 for (Index
c =
r;
c < N;
c++)
272 for (Index i = 0; i < Ninner; i++)
s +=
A(
r, i) *
A(
c, i);
279 template <
typename MAT_A>
282 using Index =
typename Derived::Index;
283 const auto N =
A.cols(), Ninner =
A.rows();
285 for (Index
r = 0;
r < N;
r++)
288 for (Index
c =
r;
c < N;
c++)
291 for (Index i = 0; i < Ninner; i++)
s +=
A(i,
r) *
A(i,
c);
void matProductOf_AtA(const MAT_A &A)
this = AT * A
bool eig(Derived &eVecs, std::vector< Scalar > &eVals, bool sorted=true) const
Computes the eigenvectors and eigenvalues for a square, general matrix.
A compile-time fixed-size numeric matrix container.
static Derived Identity()
auto col(int colIdx) const
void unsafeRemoveColumns(const std::vector< std::size_t > &idxs)
Removes columns of the matrix.
#define ASSERT_BELOW_(__A, __B)
bool chol(Derived &U) const
Cholesky M=UT * U decomposition for symmetric matrix (upper-half of the matrix is actually ignored...
void insertMatrix(const int row_start, const int col_start, const OTHERMATVEC &submat)
Copies the given input submatrix/vector into this matrix/vector, starting at the given top-left coord...
auto row(int rowIdx) const
int rank(Scalar threshold=0) const
Finds the rank of the matrix via LU decomposition.
bool eig_symmetric(Derived &eVecs, std::vector< Scalar > &eVals, bool sorted=true) const
Read: eig()
void matProductOf_AAt(const MAT_A &A)
this = A * AT
CMatrixFixed< Scalar, BLOCK_ROWS, BLOCK_COLS > extractMatrix(const int start_row=0, const int start_col=0) const
This base provides a set of functions for maths stuff.
Derived inverse() const
Returns the inverse of a general matrix using LU.
Scalar minimumDiagonal() const
Returns the minimum value in the diagonal.
CMatrixDynamic< Scalar > extractMatrix(const int BLOCK_ROWS, const int BLOCK_COLS, const int start_row, const int start_col) const
#define ASSERT_EQUAL_(__A, __B)
Assert comparing two values, reporting their actual values upon failure.
VECTOR_LIKE extractRow(int rowIdx) const
Scalar det() const
Determinant of matrix.
Scalar maximumDiagonal() const
Returns the maximum value in the diagonal.
#define ASSERTMSG_(f, __ERROR_MSG)
Defines an assertion mechanism.
void extractColumn(int colIdx, VECTOR_LIKE &v) const
void matProductOf_AB(const Derived &A, const Derived &B)
this = A*B, with A & B of the same type of this.
Derived inverse_LLt() const
Returns the inverse of a symmetric matrix using LLt.
void removeColumns(const std::vector< std::size_t > &idxsToRemove)
Removes columns of the matrix.
Base CRTP class for all MRPT matrices.
GLdouble GLdouble GLdouble r
VECTOR_LIKE extractColumn(int colIdx) const
void setDiagonal(const std::vector< Scalar > &diags)
Resizes to NxN, with N the length of the input vector, set all entries to zero, except the main diago...
void setDiagonal(const Scalar value)
Set all entries to zero, except the main diagonal which is set to value
void unsafeRemoveRows(const std::vector< std::size_t > &idxs)
Removes rows of the matrix.
Scalar trace() const
Returns the trace of the matrix (not necessarily square).
GLsizei const GLfloat * value
Base CRTP class for all MRPT vectors and matrices.
#define ASSERT_BELOWEQ_(__A, __B)
void removeRows(const std::vector< std::size_t > &idxsToRemove)
Removes rows of the matrix.
const Derived & mbDerived() const
This template class provides the basic functionality for a general 2D any-size, resizable container o...
static Derived Identity(const std::size_t N)
void extractRow(int rowIdx, VECTOR_LIKE &v) const
void insertMatrixTransposed(const int row_start, const int col_start, const OTHERMATVEC &submat)
Like insertMatrix(), but inserts ‘submat’` (transposed)
void setDiagonal(const std::size_t N, const Scalar value)
Resize to NxN, set all entries to zero, except the main diagonal which is set to value ...
void setIdentity(const std::size_t N)