EmrysFilter 0.1.0
State estimation utilities in C++23 using Eigen
Loading...
Searching...
No Matches
Solve.h
Go to the documentation of this file.
1#pragma once
2
12
13#include <Eigen/Core>
14
16
17namespace Emrys::internal
18{
19
24inline constexpr int unrolledSolveSize = 8;
25
36template <typename Result, typename Decomposition, typename Rhs>
37[[nodiscard]] Result
38transposedSolve(Decomposition const & decomposition, Eigen::MatrixBase<Rhs> const & rhs)
39{
40 constexpr int size = Decomposition::MatrixType::RowsAtCompileTime;
41 if constexpr (size != Eigen::Dynamic && size <= unrolledSolveSize)
42 {
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)
47 {
48 Column const column = rhs.col(j);
49 result.row(j) = decomposition.solve(column).transpose();
50 }
51 return result;
52 }
53 else
54 {
55 Result result = decomposition.solve(rhs).transpose();
56 return result;
57 }
58}
59
68template <typename Solver, typename Derived>
69void
70solveInPlace(Solver const & solver, Eigen::MatrixBase<Derived> & matrix)
71{
72 constexpr int size = Derived::RowsAtCompileTime;
73 if constexpr (size != Eigen::Dynamic && size <= unrolledSolveSize && Derived::ColsAtCompileTime != 1)
74 {
75 using Column = Eigen::Matrix<typename Derived::Scalar, size, 1>;
76 for (Eigen::Index j = 0; j < matrix.cols(); ++j)
77 {
78 Column column = matrix.col(j);
79 solver.solveInPlace(column);
80 matrix.col(j) = column;
81 }
82 }
83 else
84 {
85 solver.solveInPlace(matrix);
86 }
87}
88
97template <typename Result, typename Decomposition>
98[[nodiscard]] Result
99inverseFrom(Decomposition const & decomposition)
100{
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)
105 {
106 using Column = Eigen::Matrix<typename Matrix::Scalar, size, 1>;
107 auto result = Result{};
108 result.resize(n, n);
109 for (Eigen::Index j = 0; j < n; ++j)
110 {
111 result.col(j) = decomposition.solve(Column::Unit(n, j));
112 }
113 return result;
114 }
115 else
116 {
117 Result result = decomposition.solve(Result::Identity(n, n));
118 return result;
119 }
120}
121
122} // namespace Emrys::internal
Products of fixed-size matrices by Eigen's fixed-size product at every size: multiply() is by Eigen'...