/** * @param A coefficient matrix * @param A_QR Householder QR decomposition of coefficient matrix * @param b right-hand side * @param[out] x solution of the linear system * @return whether all went well (false if errors occurred) */ bool solveInternal(const EigenMatrix& A, const ::Eigen::HouseholderQR<EigenMatrix>& A_QR, base::DataVector& b, base::DataVector& x) { const SGPP::float_t tolerance = #if USE_DOUBLE_PRECISION 1e-12; #else 1e-4; #endif // solve system EigenVector bEigen = EigenVector::Map(b.getPointer(), b.getSize()); EigenVector xEigen = A_QR.solve(bEigen); // check solution if ((A * xEigen).isApprox(bEigen, tolerance)) { x = base::DataVector(xEigen.data(), xEigen.size()); return true; } else { return false; } }
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)), B(Matrix::Random(size, size)); Matrix X(size,size); const ComplexMatrix complexA(ComplexMatrix::Random(size, size)); const Matrix saA = A.adjoint() * A; const Vector b(Vector::Random(size)); Vector x(size); // Cholesky module Eigen::LLT<Matrix> LLT; LLT.compute(A); X = LLT.solve(B); x = LLT.solve(b); Eigen::LDLT<Matrix> LDLT; LDLT.compute(A); X = LDLT.solve(B); x = LDLT.solve(b); // 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); X = ppLU.solve(B); x = ppLU.solve(b); Eigen::FullPivLU<Matrix> fpLU; fpLU.compute(A); X = fpLU.solve(B); x = fpLU.solve(b); // QR module Eigen::HouseholderQR<Matrix> hQR; hQR.compute(A); X = hQR.solve(B); x = hQR.solve(b); Eigen::ColPivHouseholderQR<Matrix> cpQR; cpQR.compute(A); X = cpQR.solve(B); x = cpQR.solve(b); Eigen::FullPivHouseholderQR<Matrix> fpQR; fpQR.compute(A); // FIXME X = fpQR.solve(B); x = fpQR.solve(b); // SVD module Eigen::JacobiSVD<Matrix> jSVD; jSVD.compute(A, ComputeFullU | ComputeFullV); }