numerics 0.1.0
Loading...
Searching...
No Matches
qr.cpp
Go to the documentation of this file.
1/// @file linalg/factorization/qr.cpp
2/// @brief QR dispatcher + qr_solve.
3
5#include "backends/lapack/impl.hpp"
6#include "backends/seq/impl.hpp"
7
8namespace num {
9
10QRResult qr(const Matrix& A, Backend backend) {
11 switch (backend) {
12 case Backend::lapack:
13 return backends::lapack::qr(A);
14 default:
15 return backends::seq::qr(A);
16 }
17}
18
19void qr_solve(const QRResult& f, const Vector& b, Vector& x) {
20 const idx m = f.Q.rows();
21 const idx n = f.R.cols();
22
23 Vector y(m, real(0));
24 for (idx i = 0; i < m; ++i)
25 for (idx j = 0; j < m; ++j)
26 y[i] += f.Q(j, i) * b[j];
27
28 Vector xv(n, real(0));
29 for (idx i = n; i-- > 0;) {
30 xv[i] = y[i];
31 for (idx j = i + 1; j < n; ++j)
32 xv[i] -= f.R(i, j) * xv[j];
33 xv[i] /= f.R(i, i);
34 }
35
36 x = std::move(xv);
37}
38
39} // namespace num
constexpr idx rows() const noexcept
Definition matrix.hpp:87
constexpr idx cols() const noexcept
Definition matrix.hpp:88
QRResult qr(const Matrix &A)
Definition qr.cpp:16
QRResult qr(const Matrix &A)
Definition qr.cpp:11
double real
Definition types.hpp:10
void qr_solve(const QRResult &f, const Vector &b, Vector &x)
Solve .
Definition qr.cpp:19
Backend
Definition policy.hpp:7
QRResult qr(const Matrix &A, Backend backend=lapack_backend)
Factor as .
Definition qr.cpp:10
std::size_t idx
Definition types.hpp:11
QR factorization via Householder reflections.
QR factorization .
Definition qr.hpp:11
Matrix R
Definition qr.hpp:13
Matrix Q
Definition qr.hpp:12