25#define ARRAY_USE_EIGEN
39extern lapack_int LAPACKE_dsyev(
int matrix_layout,
char jobz,
char uplo, lapack_int n,
double* a, lapack_int lda,
42extern lapack_int LAPACKE_zheev(
int matrix_layout,
char jobz,
char uplo, lapack_int n, lapack_complex_double* a,
43 lapack_int lda,
double* w);
45extern lapack_int LAPACKE_zgeev(
int matrix_layout,
char jobvl,
char jobvr, lapack_int n, lapack_complex_double* a,
46 lapack_int lda, lapack_complex_double* w, lapack_complex_double* vl, lapack_int ldvl,
47 lapack_complex_double* vr, lapack_int ldvr);
49void EigenSolve(num_real* E, num_real* T, num_real* A,
const int& N);
51void EigenSolve(num_real* E, num_complex* T, num_complex* A,
const int& N);
53void EigenSolve_zgeev(num_complex* E, num_complex* Tl, num_complex* Tr, num_complex* A,
const int& N);
57#elif defined(ARRAY_USE_EIGEN)
59#include "../thirdpart/Eigen/Dense"
60#include "../thirdpart/Eigen/QR"
62#define EigMajor Eigen::RowMajor
65using EigVX = Eigen::Matrix<T, Eigen::Dynamic, 1, EigMajor>;
68using EigMX = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic, EigMajor>;
71using EigAX = Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic, EigMajor>;
86void LinearSolve(num_real* x, num_real* A, num_real* b,
const int& N);
88void EigenSolve(num_real* E, num_real* T, num_real* A,
const int& N);
90void EigenSolve(num_real* E, num_complex* T, num_complex* A,
const int& N);
92void EigenSolve(num_complex* E, num_complex* T, num_complex* A,
const int& N);
94void PseudoInverse(num_real* A, num_real* invA,
const int& N, num_real e = 1E-5);
100#define DEFINE_POINTER(T, name) \
102 EigMX<T>& ref_##name() { return name##_eigen_container; } \
104 EigMX<T> name##_eigen_container;
106#define DEFINE_POINTER_PROTECTED(T, name) \
108 EigMX<T>& ref_##name() { return name##_eigen_container; } \
112 EigMX<T> name##_eigen_container;
117#define ALLOCATE_PTR_TO_VECTOR(name, size) \
118 name##_eigen_container.resize(size, 1); \
119 name = name##_eigen_container.data();
124#define ALLOCATE_PTR_TO_MATRIX(name, size1, size2) \
125 name##_eigen_container.resize(size1, size2); \
126 name = name##_eigen_container.data();
293A.cast<num_real>(); // num_real(A)
294A.cast<float>(); // single(A)
295A.cast<int>(); // int32(A)
298// if the original type equals destination type, no work is done
301// Solve Ax = b. Result stored in x. Matlab: x = A \ b.
302x = A.ldlt().solve(b)); // A sym. p.s.d. #include <Eigen/Cholesky>
303x = A.llt() .solve(b)); // A sym. p.d. #include <Eigen/Cholesky>
304x = A.lu() .solve(b)); // Stable and fast. #include <Eigen/LU>
305x = A.qr() .solve(b)); // No pivoting. #include <Eigen/QR>
306x = A.svd() .solve(b)); // Stable, slowest. #include <Eigen/SVD>
307// .ldlt() -> .matrixL() and .matrixD()
308// .llt() -> .matrixL()
309// .lu() -> .matrixL() and .matrixU()
310// .qr() -> .matrixQ() and .matrixR()
311// .svd() -> .matrixU(), .singularValues(), and .matrixV()
313// Eigenvalue problems
315A.eigenvalues(); // eig(A);
316EigenSolver<Matrix3d> eig(A); // [vec val] = eig(A)
317eig.eigenvalues(); // diag(val)
318eig.eigenvectors(); // vec
319// For self-adjoint matrices use SelfAdjointEigenSolver<>
322// Use Map of Eigen, associate Map class with C++ pointer
325std::cout << std::setiosflags(std::ios::scientific)
326 << std::setprecision(8) << W << std::endl;
328*****************************************/
Eigen::Map< EigMXr > MapMXr
EigVX< num_complex > EigVXc
EigMX< num_complex > EigMXc
Eigen::Map< EigMXc > MapMXc
Eigen::Map< EigAXr > MapAXr
void EigenSolve(num_real *E, num_real *T, num_real *A, const int &N)
Eigen::Map< EigVXr > MapVXr
void PseudoInverse(num_real *A, num_real *invA, const int &N, num_real e=1E-5)
void LinearSolve(num_real *x, num_real *A, num_real *b, const int &N)
Eigen::Map< EigAXc > MapAXc
EigMX< num_complex > EigAXc
Eigen::Map< EigVXc > MapVXc
Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic, EigMajor > EigMX
Eigen::Matrix< T, Eigen::Dynamic, 1, EigMajor > EigVX
Eigen::Array< T, Eigen::Dynamic, Eigen::Dynamic, EigMajor > EigAX