1#ifndef LAMBDA_LANCZOS_TRIDIAGONAL_LAPACK_H_
2#define LAMBDA_LANCZOS_TRIDIAGONAL_LAPACK_H_
12#if defined(LAMBDA_LANCZOS_USE_LAPACK)
14#elif defined(LAMBDA_LANCZOS_USE_MKL)
24inline lapack_int
stev(
int matrix_layout,
char jobz, lapack_int n,
float* d,
float* e,
float* z, lapack_int ldz) {
25 return LAPACKE_sstev(matrix_layout, jobz, n, d, e, z, ldz);
28inline lapack_int
stev(
int matrix_layout,
char jobz, lapack_int n,
double* d,
double* e,
double* z, lapack_int ldz) {
29 return LAPACKE_dstev(matrix_layout, jobz, n, d, e, z, ldz);
37 const std::vector<T>& beta,
39 const size_t n = alpha.size();
42 auto z = std::vector<T>(1);
45 stev(LAPACK_COL_MAJOR,
'N', n, a.data(), b.data(), z.data(), 1);
56 const std::vector<T>& beta,
57 std::vector<T>& eigenvalues,
58 std::vector<std::vector<T>>& eigenvectors,
59 bool compute_eigenvector =
true) {
60 const size_t n = alpha.size();
63 auto z = std::vector<T>(n*n);
64 char jobz = compute_eigenvector ?
'V' :
'N';
66 stev(LAPACK_COL_MAJOR, jobz, n, a.data(), b.data(), z.data(), n);
69 eigenvalues = std::move(a);
70 eigenvectors.resize(n);
71 for(
size_t k = 0; k < n; ++k) {
72 eigenvectors[k] = std::vector<T>(n);
73 for(
size_t i = 0; i < n; ++i) {
74 eigenvectors[k][i] = z[k*n + i];
92 const std::vector<T>& beta,
93 std::vector<T>& eigenvalues) {
94 std::vector<std::vector<T>> dummy_eigenvectors;
T find_mth_eigenvalue(const std::vector< T > &alpha, const std::vector< T > &beta, const size_t index)
Finds the mth smaller eigenvalue of given tridiagonal matrix.
Definition: lambda_lanczos_tridiagonal_lapack.hpp:36
lapack_int stev(int matrix_layout, char jobz, lapack_int n, float *d, float *e, float *z, lapack_int ldz)
Definition: lambda_lanczos_tridiagonal_lapack.hpp:24
void tridiagonal_eigenpairs(const std::vector< T > &alpha, const std::vector< T > &beta, std::vector< T > &eigenvalues, std::vector< std::vector< T > > &eigenvectors, bool compute_eigenvector=true)
Computes all eigenpairs (eigenvalues and eigenvectors) for given tri-diagonal matrix.
Definition: lambda_lanczos_tridiagonal_lapack.hpp:55
void tridiagonal_eigenvalues(const std::vector< T > &alpha, const std::vector< T > &beta, std::vector< T > &eigenvalues)
Computes all eigenvalues for given tri-diagonal matrix using the Implicitly Shifted QR algorithm.
Definition: lambda_lanczos_tridiagonal_lapack.hpp:91
Definition: eigenpair_manager.hpp:10