17namespace Emrys::internal
24inline constexpr int unrolledSolveSize = 8;
36template <
typename Result,
typename Decomposition,
typename Rhs>
38transposedSolve(Decomposition
const & decomposition, Eigen::MatrixBase<Rhs>
const & rhs)
40 constexpr int size = Decomposition::MatrixType::RowsAtCompileTime;
41 if constexpr (size != Eigen::Dynamic && size <= unrolledSolveSize)
43 using Column = Eigen::Matrix<typename Rhs::Scalar, size, 1>;
44 auto result = Result{};
45 result.resize(rhs.cols(), rhs.rows());
46 for (Eigen::Index j = 0; j < rhs.cols(); ++j)
48 Column
const column = rhs.col(j);
49 result.row(j) = decomposition.solve(column).transpose();
55 Result result = decomposition.solve(rhs).transpose();
68template <
typename Solver,
typename Derived>
70solveInPlace(Solver
const & solver, Eigen::MatrixBase<Derived> & matrix)
72 constexpr int size = Derived::RowsAtCompileTime;
73 if constexpr (size != Eigen::Dynamic && size <= unrolledSolveSize && Derived::ColsAtCompileTime != 1)
75 using Column = Eigen::Matrix<typename Derived::Scalar, size, 1>;
76 for (Eigen::Index j = 0; j < matrix.cols(); ++j)
78 Column column = matrix.col(j);
79 solver.solveInPlace(column);
80 matrix.col(j) = column;
85 solver.solveInPlace(matrix);
97template <
typename Result,
typename Decomposition>
99inverseFrom(Decomposition
const & decomposition)
101 using Matrix =
typename Decomposition::MatrixType;
102 constexpr int size = Matrix::RowsAtCompileTime;
103 Eigen::Index
const n = decomposition.rows();
104 if constexpr (size != Eigen::Dynamic && size <= unrolledSolveSize)
106 using Column = Eigen::Matrix<typename Matrix::Scalar, size, 1>;
107 auto result = Result{};
109 for (Eigen::Index j = 0; j < n; ++j)
111 result.col(j) = decomposition.solve(Column::Unit(n, j));
117 Result result = decomposition.solve(Result::Identity(n, n));
Products of fixed-size matrices by Eigen's fixed-size product at every size: multiply() is by Eigen'...