diff options
| author | y-jan137 <yousefjan24000@gmail.com> | 2026-03-14 22:10:21 +0300 |
|---|---|---|
| committer | y-jan137 <yousefjan24000@gmail.com> | 2026-03-14 22:10:21 +0300 |
| commit | a5ca13e44165ee8a3420a57b95bcf84437a81dce (patch) | |
| tree | cfefc81276e76b5a732d7bcbac358fcfa121ff1e /include | |
| parent | 7db0d82731ababdf0b2f4d986dd54da3b4650954 (diff) | |
Add LU and experiment
Diffstat (limited to 'include')
| -rw-r--r-- | include/lu.hpp | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/include/lu.hpp b/include/lu.hpp new file mode 100644 index 0000000..6717733 --- /dev/null +++ b/include/lu.hpp @@ -0,0 +1,43 @@ +#pragma once + +#include <cstddef> +#include <vector> + +#include "matrix.hpp" +#include "vector.hpp" + +namespace linalg { + +// Result of LU factorization with partial pivoting. +// +// The factorization satisfies PA = LU, where: +// P is the permutation matrix encoded by `perm` +// L is unit lower triangular (L[i][i] == 1) +// U is upper triangular +// +// `perm[i]` = index of the original row that ended up at position i. +// Applying P to a vector b means: (Pb)[i] = b[perm[i]]. +// +// `sign` is the sign of the permutation: +1 if an even number of row +// swaps were made, -1 if odd. Useful for computing det(A) = sign * prod(diag(U)). +struct LUResult { + Matrix L; + Matrix U; + std::vector<std::size_t> perm; + int sign; +}; + +// Compute the LU factorization of A with partial pivoting. +// +// Throws DimensionMismatchError if A is not square. +// Throws SingularMatrixError if A is (numerically) singular, i.e. any +// pivot is smaller in magnitude than `singular_tolerance`. +LUResult lu_factor(const Matrix& A, double singular_tolerance = 1e-12); + +// Solve Ax = b given a precomputed LU factorization. +// +// Applies the stored permutation, then forward / backward substitution. +// Throws DimensionMismatchError if b.size() != lu.L.rows(). +Vector lu_solve(const LUResult& lu, const Vector& b); + +} // namespace linalg |