11#ifndef CUBBYFLOW_MATRIX_DENSE_BASE_IMPL_HPP
12#define CUBBYFLOW_MATRIX_DENSE_BASE_IMPL_HPP
19template <
typename T,
size_t Rows,
size_t Cols,
typename D>
20template <
size_t R,
size_t C,
typename E>
24 for (
size_t i = 0; i <
GetRows(); ++i)
26 for (
size_t j = 0; j <
GetCols(); ++j)
33template <
typename T,
size_t Rows,
size_t Cols,
typename D>
38 for (
size_t i = 0; i <
n; ++i)
44template <
typename T,
size_t Rows,
size_t Cols,
typename D>
47 for (
size_t i = 0; i <
GetRows(); ++i)
49 for (
size_t j = 0; j <
GetCols(); ++j)
59template <
typename T,
size_t Rows,
size_t Cols,
typename D>
60template <
size_t R,
size_t C,
typename E>
66 for (
size_t j = 0; j <
GetCols(); ++j)
72template <
typename T,
size_t Rows,
size_t Cols,
typename D>
73template <
size_t R,
size_t C,
typename E>
79 for (
size_t i = 0; i <
GetRows(); ++i)
85template <
typename T,
size_t Rows,
size_t Cols,
typename D>
88 GetDerived() /= GetDerived().
Norm();
91template <
typename T,
size_t Rows,
size_t Cols,
typename D>
99template <
typename T,
size_t Rows,
size_t Cols,
typename D>
105template <
typename T,
size_t Rows,
size_t Cols,
typename D>
111 return GetDerived()[j + i *
GetCols()];
114template <
typename T,
size_t Rows,
size_t Cols,
typename D>
120 return GetDerived()[j + i *
GetCols()];
123template <
typename T,
size_t Rows,
size_t Cols,
typename D>
124template <
size_t R,
size_t C,
typename E>
133template <
typename T,
size_t Rows,
size_t Cols,
typename Derived>
135std::enable_if_t<IsMatrixSizeStatic<Rows, Cols>(),
D>
141template <
typename T,
size_t Rows,
size_t Cols,
typename Derived>
143std::enable_if_t<IsMatrixSizeDynamic<Rows, Cols>(),
D>
149template <
typename T,
size_t Rows,
size_t Cols,
typename Derived>
151std::enable_if_t<IsMatrixSizeStatic<Rows, Cols>(),
D>
157template <
typename T,
size_t Rows,
size_t Cols,
typename Derived>
159std::enable_if_t<IsMatrixSizeDynamic<Rows, Cols>(),
D>
166template <
typename T,
size_t Rows,
size_t Cols,
typename Derived>
168std::enable_if_t<IsMatrixStaticSquare<Rows, Cols>(),
D>
177template <
typename T,
size_t Rows,
size_t Cols,
typename Derived>
179std::enable_if_t<IsMatrixSizeDynamic<Rows, Cols>(),
D>
188template <
typename T,
size_t Rows,
size_t Cols,
typename Derived>
189template <
typename...
Args,
typename D>
190std::enable_if_t<IsMatrixStaticSquare<Rows, Cols>(),
D>
194 static_assert(
sizeof...(rest) ==
Rows - 1,
195 "Number of parameters should match the size of diagonal.");
200 for (
size_t i = 0; i <
Rows; ++i)
208template <
typename T,
size_t Rows,
size_t Cols,
typename Derived>
209template <
size_t R,
size_t C,
typename E,
typename D>
210std::enable_if_t<IsMatrixStaticSquare<Rows, Cols>(),
D>
218 for (
size_t i = 0; i <
Rows; ++i)
226template <
typename T,
size_t Rows,
size_t Cols,
typename Derived>
228std::enable_if_t<IsMatrixStaticSquare<Rows, Cols>() && (
Rows == 2),
D>
231 return D{ std::cos(
rad), -std::sin(
rad), std::sin(
rad), std::cos(
rad) };
234template <
typename T,
size_t Rows,
size_t Cols,
typename Derived>
235template <
size_t R,
size_t C,
typename E,
typename D>
236std::enable_if_t<IsMatrixStaticSquare<Rows, Cols>() && (
Rows == 3 ||
Rows == 4),
269template <
typename T,
size_t Rows,
size_t Cols,
typename Derived>
270template <
size_t R,
size_t C,
typename E,
typename D>
271std::enable_if_t<IsMatrixStaticSquare<Rows, Cols>() && (
Rows == 4),
D>
286template <
typename T,
size_t Rows,
size_t Cols,
typename D>
289 return static_cast<const D&
>(*this).
GetRows();
292template <
typename T,
size_t Rows,
size_t Cols,
typename D>
293constexpr size_t MatrixDenseBase<T, Rows, Cols, D>::GetCols()
const
295 return static_cast<const D&
>(*this).
GetCols();
298template <
typename T,
size_t Rows,
size_t Cols,
typename D>
299auto MatrixDenseBase<T, Rows, Cols, D>::begin()
304template <
typename T,
size_t Rows,
size_t Cols,
typename D>
305constexpr auto MatrixDenseBase<T, Rows, Cols, D>::begin()
const
310template <
typename T,
size_t Rows,
size_t Cols,
typename D>
311auto MatrixDenseBase<T, Rows, Cols, D>::end()
316template <
typename T,
size_t Rows,
size_t Cols,
typename D>
317constexpr auto MatrixDenseBase<T, Rows, Cols, D>::end()
const
322template <
typename T,
size_t Rows,
size_t Cols,
typename D>
324MatrixDenseBase<T, Rows, Cols, D>::operator[](
size_t i)
331template <
typename T,
size_t Rows,
size_t Cols,
typename D>
333MatrixDenseBase<T, Rows, Cols, D>::operator[](
size_t i)
const
340template <
typename T,
size_t Rows,
size_t Cols,
typename D>
341D& MatrixDenseBase<T, Rows, Cols, D>::GetDerived()
343 return static_cast<D&
>(*this);
346template <
typename T,
size_t Rows,
size_t Cols,
typename D>
347const D& MatrixDenseBase<T, Rows, Cols, D>::GetDerived()
const
349 return static_cast<const D&
>(*this);
Definition MatrixDenseBase.hpp:21
void Transpose()
Transposes this matrix.
Definition MatrixDenseBase-Impl.hpp:92
void Normalize()
Definition MatrixDenseBase-Impl.hpp:86
void SetOffDiagonal(ConstReference val)
Sets off-diagonal elements with input scalar.
Definition MatrixDenseBase-Impl.hpp:45
Reference operator()(size_t i, size_t j)
Definition MatrixDenseBase-Impl.hpp:107
T ValueType
Definition MatrixDenseBase.hpp:23
static std::enable_if_t< IsMatrixSizeStatic< Rows, Cols >(), D > MakeZero()
Makes a static matrix with zero entries.
Definition MatrixDenseBase-Impl.hpp:136
MatrixDenseBase & operator=(const MatrixExpression< T, R, C, E > &expression)
Copies from generic expression.
void SetColumn(size_t j, const MatrixExpression< T, R, C, E > &col)
Sets j-th column with input vector.
Definition MatrixDenseBase-Impl.hpp:74
const T & ConstReference
Definition MatrixDenseBase.hpp:25
static std::enable_if_t< IsMatrixStaticSquare< Rows, Cols >(), D > MakeIdentity()
Makes a static identity matrix.
Definition MatrixDenseBase-Impl.hpp:169
void CopyFrom(const MatrixExpression< T, R, C, E > &expression)
Copies from generic expression.
Definition MatrixDenseBase-Impl.hpp:21
static std::enable_if_t< IsMatrixSizeStatic< Rows, Cols >(), D > MakeConstant(ValueType val)
Makes a static matrix with constant entries.
Definition MatrixDenseBase-Impl.hpp:152
void Invert()
Inverts this matrix.
Definition MatrixDenseBase-Impl.hpp:100
T & Reference
Definition MatrixDenseBase.hpp:24
void SetRow(size_t i, const MatrixExpression< T, R, C, E > &row)
Sets i-th row with input column vector.
Definition MatrixDenseBase-Impl.hpp:61
static std::enable_if_t< IsMatrixStaticSquare< Rows, Cols >(), D > MakeScaleMatrix(ValueType first, Args... rest)
Makes scale matrix.
Definition MatrixDenseBase-Impl.hpp:191
void SetDiagonal(ConstReference val)
Sets diagonal elements with input scalar.
Definition MatrixDenseBase-Impl.hpp:34
Matrix< T, Rows, Cols > Inverse() const
Returns inverse matrix.
Definition MatrixExpression-Impl.hpp:371
MatrixTranspose< T, Rows, Cols, const Derived & > Transposed() const
Definition MatrixExpression-Impl.hpp:365
T Eval(size_t i, size_t j) const
Returns the evaluated value for (i, j).
Definition MatrixExpression-Impl.hpp:33
ValueType Norm() const
Definition MatrixExpression-Impl.hpp:250
Matrix< T, Rows, Cols > & GetDerived()
Returns actual implementation (the subclass).
Definition MatrixExpression-Impl.hpp:509
constexpr size_t GetCols() const
Definition Matrix-Impl.hpp:266
Iterator begin()
Definition Matrix-Impl.hpp:272
constexpr size_t GetRows() const
Definition Matrix-Impl.hpp:260
Iterator end()
Definition Matrix-Impl.hpp:285
Definition pybind11Utils.hpp:21
Matrix< T, Rows, 1 > Vector
Definition Matrix.hpp:738