10 namespace inverseHelperfunctions {
12 template <
typename SCALAR>
14 void lu(
const Eigen::Matrix<SCALAR, Eigen::Dynamic, Eigen::Dynamic>& A,
15 Eigen::Matrix<SCALAR, Eigen::Dynamic, Eigen::Dynamic>& LU)
17 const int n = A.rows();
18 for (
int k = 0; k <
n; ++k)
20 for (
int i = k;
i <
n; ++
i)
23 for (
int p = 0; p < k; ++p)
25 sum += LU(
i, p) * LU(p, k);
27 LU(
i, k) = A(
i, k) - sum;
29 for (
int j = k + 1; j <
n; ++j)
32 for (
int p = 0; p < k; ++p)
34 sum += LU(k, p) * LU(p, j);
36 LU(k, j) = (A(k, j) - sum) / LU(k, k);
42 template <
typename SCALAR>
43 void solveLU(
const Eigen::Matrix<SCALAR, Eigen::Dynamic, Eigen::Dynamic>& LU,
44 const Eigen::Matrix<SCALAR, Eigen::Dynamic, Eigen::Dynamic>& b,
45 Eigen::Matrix<SCALAR, Eigen::Dynamic, Eigen::Dynamic>& x)
47 const int n = LU.rows();
48 const int m = b.cols();
49 Eigen::Matrix<SCALAR, Eigen::Dynamic, 1> y(n);
50 for (
int j = 0; j < m; ++j)
53 for (
int i = 0;
i <
n; ++
i)
56 for (
int k = 0; k <
i; ++k)
58 sum += LU(i, k) * y[k];
60 y(i) = (b(i, j) - sum) / LU(i, i);
62 for (
int i = n - 1;
i >= 0; --
i)
65 for (
int k =
i + 1; k <
n; ++k)
67 sum += LU(
i, k) * x(k, j);
69 x(
i, j) = (y(
i) - sum);
75 template <
typename SCALAR>
77 void ldlt(
const Eigen::Matrix<SCALAR, Eigen::Dynamic, Eigen::Dynamic>& A,
78 Eigen::Matrix<SCALAR, Eigen::Dynamic, Eigen::Dynamic>& L,
79 Eigen::Matrix<SCALAR, Eigen::Dynamic, 1>& d)
81 const int n = A.rows();
83 for (
int j = 0; j <
n; ++j)
86 for (
int k = 0; k < j; ++k)
88 sum += L(j, k) * L(j, k) * d(k);
92 for (
int i = j + 1;
i <
n;
i++)
95 for (
int k = 0; k < j; ++k)
97 sum += L(
i, k) * L(j, k) * d(k);
99 L(
i, j) = (A(
i, j) - sum) / d(j);
105 template <
typename SCALAR>
107 void solveLDLT(
const Eigen::Matrix<SCALAR, Eigen::Dynamic, Eigen::Dynamic>& L,
108 const Eigen::Matrix<SCALAR, Eigen::Dynamic, 1>& d,
109 const Eigen::Matrix<SCALAR, Eigen::Dynamic, Eigen::Dynamic>& b,
110 Eigen::Matrix<SCALAR, Eigen::Dynamic, Eigen::Dynamic>& x)
112 const int n = L.rows();
113 const int m = b.cols();
114 Eigen::Matrix<SCALAR, Eigen::Dynamic, 1> y(n);
115 for (
int j = 0; j < m; ++j)
119 for (
int i = 0;
i <
n; ++
i)
122 for (
int k = 0; k <
i; k++)
124 sum += L(i, k) * y(k);
126 y(i) = (b(i, j) - sum);
129 for (
int i = n - 1;
i >= 0; --
i)
132 for (
int k =
i + 1; k <
n; ++k)
134 sum += L(k,
i) * x(k, j);
136 x(
i, j) = (y(
i) / d(
i) - sum);
149 template <
typename SCALAR>
151 Eigen::Matrix<SCALAR, Eigen::Dynamic, Eigen::Dynamic>
LUsolve(
152 const Eigen::Matrix<SCALAR, Eigen::Dynamic, Eigen::Dynamic>& A,
153 const Eigen::Matrix<SCALAR, Eigen::Dynamic, Eigen::Dynamic>& B)
155 const int n = A.rows();
156 const int m = B.cols();
157 Eigen::Matrix<SCALAR, Eigen::Dynamic, Eigen::Dynamic> LU(n, n);
158 inverseHelperfunctions::lu<SCALAR>(A, LU);
160 Eigen::Matrix<SCALAR, Eigen::Dynamic, Eigen::Dynamic>
X(n, m);
161 inverseHelperfunctions::solveLU<SCALAR>(LU, B,
X);
171 template <
typename SCALAR>
173 Eigen::Matrix<SCALAR, Eigen::Dynamic, Eigen::Dynamic>
LDLTsolve(
174 const Eigen::Matrix<SCALAR, Eigen::Dynamic, Eigen::Dynamic>& A,
175 const Eigen::Matrix<SCALAR, Eigen::Dynamic, Eigen::Dynamic>& B)
178 const int n = A.rows();
179 const int m = B.cols();
180 Eigen::Matrix<SCALAR, Eigen::Dynamic, Eigen::Dynamic> L(n, n);
181 Eigen::Matrix<SCALAR, Eigen::Dynamic, 1> d(n);
185 Eigen::Matrix<SCALAR, Eigen::Dynamic, Eigen::Dynamic>
X(n, m);
Eigen::Matrix< SCALAR, Eigen::Dynamic, Eigen::Dynamic > LUsolve(const Eigen::Matrix< SCALAR, Eigen::Dynamic, Eigen::Dynamic > &A, const Eigen::Matrix< SCALAR, Eigen::Dynamic, Eigen::Dynamic > &B)
Definition: Inverses.h:151
void lu(const Eigen::Matrix< SCALAR, Eigen::Dynamic, Eigen::Dynamic > &A, Eigen::Matrix< SCALAR, Eigen::Dynamic, Eigen::Dynamic > &LU)
Definition: Inverses.h:14
CppAD::AD< CppAD::cg::CG< double > > SCALAR
constexpr size_t n
Definition: MatrixInversionTest.cpp:14
void solveLDLT(const Eigen::Matrix< SCALAR, Eigen::Dynamic, Eigen::Dynamic > &L, const Eigen::Matrix< SCALAR, Eigen::Dynamic, 1 > &d, const Eigen::Matrix< SCALAR, Eigen::Dynamic, Eigen::Dynamic > &b, Eigen::Matrix< SCALAR, Eigen::Dynamic, Eigen::Dynamic > &x)
Definition: Inverses.h:107
void solveLU(const Eigen::Matrix< SCALAR, Eigen::Dynamic, Eigen::Dynamic > &LU, const Eigen::Matrix< SCALAR, Eigen::Dynamic, Eigen::Dynamic > &b, Eigen::Matrix< SCALAR, Eigen::Dynamic, Eigen::Dynamic > &x)
Definition: Inverses.h:43
void ldlt(const Eigen::Matrix< SCALAR, Eigen::Dynamic, Eigen::Dynamic > &A, Eigen::Matrix< SCALAR, Eigen::Dynamic, Eigen::Dynamic > &L, Eigen::Matrix< SCALAR, Eigen::Dynamic, 1 > &d)
Definition: Inverses.h:77
Eigen::Matrix< SCALAR, Eigen::Dynamic, Eigen::Dynamic > LDLTsolve(const Eigen::Matrix< SCALAR, Eigen::Dynamic, Eigen::Dynamic > &A, const Eigen::Matrix< SCALAR, Eigen::Dynamic, Eigen::Dynamic > &B)
Definition: Inverses.h:173