27 #ifndef CDPL_MATH_LINEARSOLVE_HPP
28 #define CDPL_MATH_LINEARSOLVE_HPP
40 class VectorExpression;
42 class MatrixExpression;
52 template <
typename E1,
typename E2>
59 if (e1().getSize1() != e1().getSize2())
62 if (SizeType(e1().getSize2()) != SizeType(e2().getSize()))
65 SizeType size = e2().getSize();
67 for (SizeType n = 0; n < size; n++) {
68 if (e1()(n, n) ==
typename E1::ValueType(0))
71 ValueType t = e2()(n) /= e1()(n, n);
73 if (t != ValueType(0))
74 for (SizeType
m = n + 1;
m < size;
m++)
75 e2()(
m) -= e1()(
m, n) * t;
89 template <
typename E1,
typename E2>
96 if (e1().getSize1() != e1().getSize2())
99 if (SizeType(e1().getSize2()) != SizeType(e2().getSize()))
102 SizeType size = e2().getSize();
104 for (SizeType n = 0; n < size; n++) {
105 ValueType t = e2()(n);
107 if (t != ValueType(0))
108 for (SizeType
m = n + 1;
m < size;
m++)
109 e2()(
m) -= e1()(
m, n) * t;
123 template <
typename E1,
typename E2>
130 if (e1().getSize1() != e1().getSize2())
133 if (SizeType(e1().getSize2()) != SizeType(e2().getSize1()))
136 SizeType size1 = e2().getSize1();
137 SizeType size2 = e2().getSize2();
139 for (SizeType n = 0; n < size1; n++) {
140 if (e1()(n, n) ==
typename E1::ValueType(0))
143 for (SizeType l = 0; l < size2; l++) {
144 ValueType t = e2()(n, l) /= e1()(n, n);
146 if (t != ValueType(0))
147 for (SizeType
m = n + 1;
m < size1;
m++)
148 e2()(
m, l) -= e1()(
m, n) * t;
163 template <
typename E1,
typename E2>
170 if (e1().getSize1() != e1().getSize2())
173 if (SizeType(e1().getSize2()) != SizeType(e2().getSize1()))
176 SizeType size1 = e2().getSize1();
177 SizeType size2 = e2().getSize2();
179 for (SizeType n = 0; n < size1; n++) {
180 for (SizeType l = 0; l < size2; l++) {
181 ValueType t = e2()(n, l);
183 if (t != ValueType(0))
184 for (SizeType
m = n + 1;
m < size1;
m++)
185 e2()(
m, l) -= e1()(
m, n) * t;
200 template <
typename E1,
typename E2>
208 if (e1().getSize1() != e1().getSize2())
211 if (SizeType(e1().getSize2()) != SizeType(e2().getSize()))
214 SizeType size = e2().getSize();
216 for (DifferenceType n = size - 1; n >= 0; n--) {
217 if (e1()(n, n) ==
typename E1::ValueType(0))
220 ValueType t = e2()(n) /= e1()(n, n);
222 if (t != ValueType(0))
223 for (DifferenceType
m = n - 1;
m >= 0;
m--)
224 e2()(
m) -= e1()(
m, n) * t;
238 template <
typename E1,
typename E2>
246 if (e1().getSize1() != e1().getSize2())
249 if (SizeType(e1().getSize2()) != SizeType(e2().getSize()))
252 SizeType size = e2().getSize();
254 for (DifferenceType n = size - 1; n >= 0; n--) {
255 ValueType t = e2()(n);
257 if (t != ValueType(0))
258 for (DifferenceType
m = n - 1;
m >= 0;
m--)
259 e2()(
m) -= e1()(
m, n) * t;
273 template <
typename E1,
typename E2>
281 if (e1().getSize1() != e1().getSize2())
284 if (SizeType(e1().getSize2()) != SizeType(e2().getSize1()))
287 SizeType size1 = e2().getSize1();
288 SizeType size2 = e2().getSize2();
290 for (DifferenceType n = size1 - 1; n >= 0; n--) {
291 if (e1()(n, n) ==
typename E1::ValueType(0))
294 for (DifferenceType l = size2 - 1; l >= 0; l--) {
295 ValueType t = e2()(n, l) /= e1()(n, n);
297 if (t != ValueType(0))
298 for (DifferenceType
m = n - 1;
m >= 0;
m--)
299 e2()(
m, l) -= e1()(
m, n) * t;
314 template <
typename E1,
typename E2>
322 if (e1().getSize1() != e1().getSize2())
325 if (SizeType(e1().getSize2()) != SizeType(e2().getSize1()))
328 SizeType size1 = e2().getSize1();
329 SizeType size2 = e2().getSize2();
331 for (DifferenceType n = size1 - 1; n >= 0; n--) {
332 for (DifferenceType l = size2 - 1; l >= 0; l--) {
333 ValueType t = e2()(n, l);
335 if (t != ValueType(0))
336 for (DifferenceType
m = n - 1;
m >= 0;
m--)
337 e2()(
m, l) -= e1()(
m, n) * t;
CRTP base class for all matrix expression types.
Definition: Expression.hpp:104
CRTP base class for all vector expression types.
Definition: Expression.hpp:66
constexpr unsigned int m
Specifies that the stereocenter has m configuration.
Definition: CIPDescriptor.hpp:116
bool solveUpper(const MatrixExpression< E1 > &e1, VectorExpression< E2 > &e2)
Solves in place by back-substitution, where e1 is an upper-triangular matrix.
Definition: LinearSolve.hpp:202
bool solveUnitUpper(const MatrixExpression< E1 > &e1, VectorExpression< E2 > &e2)
Solves in place by back-substitution, where e1 is a unit upper-triangular matrix (1 on the diagonal)...
Definition: LinearSolve.hpp:240
bool solveUnitLower(const MatrixExpression< E1 > &e1, VectorExpression< E2 > &e2)
Solves in place by forward-substitution, where e1 is a unit lower-triangular matrix (1 on the diagon...
Definition: LinearSolve.hpp:91
bool solveLower(const MatrixExpression< E1 > &e1, VectorExpression< E2 > &e2)
Solves in place by forward-substitution, where e1 is a lower-triangular matrix.
Definition: LinearSolve.hpp:54
The namespace of the Chemical Data Processing Library.
std::common_type< T1, T2 >::type Type
The common type.
Definition: CommonType.hpp:49