4#define EIGEN_NO_STATIC_ASSERT
11#define EigMajor Eigen::RowMajor
16using EigVX = Eigen::Matrix<T, Eigen::Dynamic, 1, EigMajor>;
19using EigMX = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic, EigMajor>;
22using EigAX = Eigen::Array<T, Eigen::Dynamic, Eigen::Dynamic, EigMajor>;
30using MapVXr = Eigen::Map<EigVXr>;
31using MapVXc = Eigen::Map<EigVXc>;
32using MapMXr = Eigen::Map<EigMXr>;
33using MapMXc = Eigen::Map<EigMXc>;
34using MapAXr = Eigen::Map<EigAXr>;
35using MapAXc = Eigen::Map<EigAXc>;
41 Mapx = MapA.householderQr().solve(Mapb);
48 Eigen::SelfAdjointEigenSolver<EigMXr> eig(MapA);
49 MapE = eig.eigenvalues().real();
50 MapT = eig.eigenvectors().real();
57 Eigen::SelfAdjointEigenSolver<EigMXc> eig(MapA);
58 MapE = eig.eigenvalues().real();
59 MapT = eig.eigenvectors();
66 Eigen::ComplexEigenSolver<EigMXc> eig(MapA);
67 MapE = eig.eigenvalues();
68 MapT = eig.eigenvectors();
73 MapMXr MapInvA(invA, N, N);
74 MapInvA = MapA.completeOrthogonalDecomposition().pseudoInverse();
86 MapMXr Map_invA(invA, N, N);
88 Map_invA = Map_A.lu().inverse();
92 MapMXc Map_invA(invA, N, N);
94 Map_invA = Map_A.lu().inverse();
115 for (
int i = 0; i < N * N; ++i) At_ptr[i] = A[i];
120 for (
int i = 0, ii = 0; i < N; ++i, ii += (N + 1)) {
121 lamb_ptr[i] = std::exp(k * lamb_ptr[i]) / Slr_ptr[ii];
144 for (
int i = 0, ik = 0; i < N; ++i) {
145 for (
int k = 0, ki = i; k < N; ++k, ++ik, ki += N) {
146 A_ptr[ik] = -0.5e0 *
kids_complex(0, 1) * (U[ik] - std::conj(U[ki]));
150 for (
int i = 0; i < N; ++i) lamb2_ptr[i] = std::exp(
kids_complex(0, 1) * lamb_ptr[i]);
definition of types in the project and some utiles for types
#define ARRAY_MATMUL3_TRANS2(_A, _B, _C, _D, _n1, _n2, _n0, _n3)
#define ARRAY_MATMUL_TRANS1(_A, _B, _C, _n1, _n2, _n3)
EigMX< kids_real > EigMXr
EigMX< kids_complex > EigAXc
Eigen::Map< EigMXr > MapMXr
Eigen::Map< EigMXc > MapMXc
Eigen::Map< EigAXr > MapAXr
Eigen::Matrix< T, Eigen::Dynamic, Eigen::Dynamic, EigMajor > EigMX
Eigen::Map< EigVXr > MapVXr
EigMX< kids_real > EigAXr
Eigen::Map< EigAXc > MapAXc
EigVX< kids_complex > EigVXc
Eigen::Matrix< T, Eigen::Dynamic, 1, EigMajor > EigVX
Eigen::Array< T, Eigen::Dynamic, Eigen::Dynamic, EigMajor > EigAX
EigVX< kids_real > EigVXr
EigMX< kids_complex > EigMXc
Eigen::Map< EigVXc > MapVXc
< http://warp.povusers.org/FunctionParser/fparser.html
void PseudoInverse(kids_real *A, kids_real *invA, size_t N, kids_real e=1E-5)
Compute the pseudo-inverse of a matrix for real numbers.
void ARRAY_CORRECT_U(kids_complex *U, size_t N)
void ARRAY_INV_MAT(kids_complex *invA, kids_complex *A, size_t N)
Compute the inverse of a matrix for complex numbers.
void ARRAY_TRANSPOSE(kids_real *A, size_t N1, size_t N2)
double kids_real
Alias for real number type.
std::complex< double > kids_complex
Alias for complex number type.
Eigen::Map< EigMXc > MapMXc
Eigen::Map< EigMXr > MapMXr
void EigenSolve(kids_real *E, kids_real *T, kids_real *A, size_t N)
Solve the eigenvalue problem for real matrices.
void ARRAY_EXP_MAT_GENERAL(kids_complex *expkA, kids_complex *A, kids_complex k, size_t N)
void LinearSolve(kids_real *x, kids_real *A, kids_real *b, size_t N)
Solve a linear system Ax = b for real matrices.