void ctms_decompositions() { const int maxSize = 16; const int size = 12; typedef Eigen::Matrix<Scalar, Eigen::Dynamic, Eigen::Dynamic, 0, maxSize, maxSize> Matrix; typedef Eigen::Matrix<Scalar, Eigen::Dynamic, 1, 0, maxSize, 1> Vector; typedef Eigen::Matrix<std::complex<Scalar>, Eigen::Dynamic, Eigen::Dynamic, 0, maxSize, maxSize> ComplexMatrix; const Matrix A(Matrix::Random(size, size)); const ComplexMatrix complexA(ComplexMatrix::Random(size, size)); const Matrix saA = A.adjoint() * A; // Cholesky module Eigen::LLT<Matrix> LLT; LLT.compute(A); Eigen::LDLT<Matrix> LDLT; LDLT.compute(A); // Eigenvalues module Eigen::HessenbergDecomposition<ComplexMatrix> hessDecomp; hessDecomp.compute(complexA); Eigen::ComplexSchur<ComplexMatrix> cSchur(size); cSchur.compute(complexA); Eigen::ComplexEigenSolver<ComplexMatrix> cEigSolver; cEigSolver.compute(complexA); Eigen::EigenSolver<Matrix> eigSolver; eigSolver.compute(A); Eigen::SelfAdjointEigenSolver<Matrix> saEigSolver(size); saEigSolver.compute(saA); Eigen::Tridiagonalization<Matrix> tridiag; tridiag.compute(saA); // LU module Eigen::PartialPivLU<Matrix> ppLU; ppLU.compute(A); Eigen::FullPivLU<Matrix> fpLU; fpLU.compute(A); // QR module Eigen::HouseholderQR<Matrix> hQR; hQR.compute(A); Eigen::ColPivHouseholderQR<Matrix> cpQR; cpQR.compute(A); Eigen::FullPivHouseholderQR<Matrix> fpQR; fpQR.compute(A); // SVD module Eigen::JacobiSVD<Matrix> jSVD; jSVD.compute(A, ComputeFullU | ComputeFullV); }
void solvpermb_on3(const Matrix & A, Vector & b, Matrix & X) { // Size of b, which is size of A int n = b.size(); if( n != A.cols() or n != A.rows() ) { // Size check, error if do not match std::cerr << "Error: size mismatch!" << std::endl; return; } X.resize(n,n); // Notice here we reuse the LU factorization Eigen::FullPivLU<Matrix> LU = A.fullPivLu(); for(int l = 0; l < n; ++l) { X.col(l) = LU.solve(b); shift(b); } }