39 throw std::invalid_argument(
"lanczos: k must satisfy 0 < k <= n");
42 max_steps = std::min(3 * k, n);
43 max_steps = std::min(max_steps, n);
47 Matrix V(n, max_steps, 0.0);
50 Vector alpha(max_steps, 0.0);
54 for (
idx i = 0; i < n; ++i)
55 V(i, 0) = (i == 0) ? 1.0 : 0.0;
59 for (
idx j = 0; j < max_steps; ++j) {
62 for (
idx i = 0; i < n; ++i)
76 for (
idx i = 0; i < n; ++i) {
77 w[i] -=
beta[j - 1] * V(i, j - 1);
94 if (j + 1 < max_steps) {
95 for (
idx i = 0; i < n; ++i)
96 V(i, j + 1) = w[i] / b;
105 for (
idx j = 0; j < m; ++j) {
108 T(j, j + 1) =
beta[j];
109 T(j + 1, j) =
beta[j];
116 idx nret = std::min(k, m);
120 Matrix ritz_vecs(n, nret, 0.0);
121 for (
idx i = 0; i < nret; ++i) {
122 idx ti = m - nret + i;
123 for (
idx j = 0; j < m; ++j) {
125 for (
idx r = 0; r < n; ++r)
126 ritz_vecs(r, i) += coeff * V(r, j);
132 for (
idx i = 0; i < nret; ++i)
133 ritz_vals[i] = teig.
values[m - nret + i];
136 bool all_converged =
true;
137 for (
idx i = 0; i < nret; ++i) {
139 for (
idx r = 0; r < n; ++r)
140 u[r] = ritz_vecs(r, i);
146 real lam = ritz_vals[i];
147 for (
idx r = 0; r < n; ++r) {
148 real d = Au[r] - lam * u[r];
151 if (std::sqrt(res) > tol) {
152 all_converged =
false;
157 return {ritz_vals, ritz_vecs, steps, all_converged};
Dense row-major matrix with optional GPU storage.
Full symmetric eigendecomposition via cyclic Jacobi sweeps.
Lanczos algorithm – k extreme eigenvalues of a large sparse matrix.
real mgs_orthogonalize(const std::vector< Vector > &basis, Vector &v, std::vector< real > &h, idx k)
Modified Gram-Schmidt: orthogonalize v against basis[0..k-1].
Backend
Selects which backend handles a linalg operation.
real beta(real a, real b)
B(a, b) – beta function.
std::function< void(const Vector &, Vector &)> MatVecFn
Callable type for matrix-free matvec: computes y = A*x.
void matvec(const Matrix &A, const Vector &x, Vector &y, Backend b=default_backend)
y = A * x
real dot(const Vector &x, const Vector &y, Backend b=default_backend)
dot product
void axpy(real alpha, const Vector &x, Vector &y, Backend b=default_backend)
y += alpha * x
LanczosResult lanczos(MatVecFn matvec, idx n, idx k, real tol=1e-10, idx max_steps=0, Backend backend=Backend::seq)
Lanczos eigensolver for large sparse symmetric matrices.
EigenResult eig_sym(const Matrix &A, real tol=1e-12, idx max_sweeps=100, Backend backend=lapack_backend)
Full eigendecomposition of a real symmetric matrix.
Full eigendecomposition result: A = V * diag(values) * V^T.
Vector values
Eigenvalues in ascending order.
Matrix vectors
Eigenvectors as columns of an nxn orthogonal matrix.
Result of a Lanczos eigensolver.
Subspace construction and orthogonalization kernels. (namespace num::kernel::subspace)