From cd8b996f99de67035a0504cbaf0a627fb68f0f1d Mon Sep 17 00:00:00 2001 From: Gael Guennebaud Date: Mon, 8 Jun 2015 16:16:42 +0200 Subject: Extend unit test and documentation of SelfAdjointEigenSolver::computeDirect --- test/eigensolver_selfadjoint.cpp | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) (limited to 'test/eigensolver_selfadjoint.cpp') diff --git a/test/eigensolver_selfadjoint.cpp b/test/eigensolver_selfadjoint.cpp index 6750c7609..41b6d99ab 100644 --- a/test/eigensolver_selfadjoint.cpp +++ b/test/eigensolver_selfadjoint.cpp @@ -18,22 +18,34 @@ template void selfadjointeigensolver_essential_check(const { typedef typename MatrixType::Scalar Scalar; typedef typename NumTraits::Real RealScalar; - RealScalar largerEps = 10*test_precision(); + RealScalar eival_eps = (std::min)(test_precision(), NumTraits::dummy_precision()*20000); SelfAdjointEigenSolver eiSymm(m); VERIFY_IS_EQUAL(eiSymm.info(), Success); - VERIFY((m.template selfadjointView() * eiSymm.eigenvectors()).isApprox( - eiSymm.eigenvectors() * eiSymm.eigenvalues().asDiagonal(), largerEps)); + VERIFY_IS_APPROX(m.template selfadjointView() * eiSymm.eigenvectors(), + eiSymm.eigenvectors() * eiSymm.eigenvalues().asDiagonal()); VERIFY_IS_APPROX(m.template selfadjointView().eigenvalues(), eiSymm.eigenvalues()); VERIFY_IS_UNITARY(eiSymm.eigenvectors()); - SelfAdjointEigenSolver eiDirect; - eiDirect.computeDirect(m); - VERIFY_IS_EQUAL(eiDirect.info(), Success); - VERIFY((m.template selfadjointView() * eiDirect.eigenvectors()).isApprox( - eiDirect.eigenvectors() * eiDirect.eigenvalues().asDiagonal(), largerEps)); - VERIFY_IS_APPROX(m.template selfadjointView().eigenvalues(), eiDirect.eigenvalues()); - VERIFY_IS_UNITARY(eiDirect.eigenvectors()); + if(m.cols()<=4) + { + SelfAdjointEigenSolver eiDirect; + eiDirect.computeDirect(m); + VERIFY_IS_EQUAL(eiDirect.info(), Success); + VERIFY_IS_APPROX(eiSymm.eigenvalues(), eiDirect.eigenvalues()); + if(! eiSymm.eigenvalues().isApprox(eiDirect.eigenvalues(), eival_eps) ) + { + std::cerr << "reference eigenvalues: " << eiSymm.eigenvalues().transpose() << "\n" + << "obtained eigenvalues: " << eiDirect.eigenvalues().transpose() << "\n" + << "diff: " << (eiSymm.eigenvalues()-eiDirect.eigenvalues()).transpose() << "\n" + << "error (eps): " << (eiSymm.eigenvalues()-eiDirect.eigenvalues()).norm() / eiSymm.eigenvalues().norm() << " (" << eival_eps << ")\n"; + } + VERIFY(eiSymm.eigenvalues().isApprox(eiDirect.eigenvalues(), eival_eps)); + VERIFY_IS_APPROX(m.template selfadjointView() * eiDirect.eigenvectors(), + eiDirect.eigenvectors() * eiDirect.eigenvalues().asDiagonal()); + VERIFY_IS_APPROX(m.template selfadjointView().eigenvalues(), eiDirect.eigenvalues()); + VERIFY_IS_UNITARY(eiDirect.eigenvectors()); + } } template void selfadjointeigensolver(const MatrixType& m) -- cgit v1.2.3