mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-08-12 11:49:02 +08:00
Fix testing of nearly zero input matrices.
This commit is contained in:
parent
c9e3e438eb
commit
fd2f989b1d
@ -23,8 +23,18 @@ template<typename MatrixType> void selfadjointeigensolver_essential_check(const
|
|||||||
|
|
||||||
SelfAdjointEigenSolver<MatrixType> eiSymm(m);
|
SelfAdjointEigenSolver<MatrixType> eiSymm(m);
|
||||||
VERIFY_IS_EQUAL(eiSymm.info(), Success);
|
VERIFY_IS_EQUAL(eiSymm.info(), Success);
|
||||||
VERIFY_IS_APPROX(m.template selfadjointView<Lower>() * eiSymm.eigenvectors(),
|
|
||||||
eiSymm.eigenvectors() * eiSymm.eigenvalues().asDiagonal());
|
RealScalar scaling = m.cwiseAbs().maxCoeff();
|
||||||
|
|
||||||
|
if(scaling<(std::numeric_limits<RealScalar>::min)())
|
||||||
|
{
|
||||||
|
VERIFY(eiSymm.eigenvalues().cwiseAbs().maxCoeff() <= (std::numeric_limits<RealScalar>::min)());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
VERIFY_IS_APPROX((m.template selfadjointView<Lower>() * eiSymm.eigenvectors())/scaling,
|
||||||
|
(eiSymm.eigenvectors() * eiSymm.eigenvalues().asDiagonal())/scaling);
|
||||||
|
}
|
||||||
VERIFY_IS_APPROX(m.template selfadjointView<Lower>().eigenvalues(), eiSymm.eigenvalues());
|
VERIFY_IS_APPROX(m.template selfadjointView<Lower>().eigenvalues(), eiSymm.eigenvalues());
|
||||||
VERIFY_IS_UNITARY(eiSymm.eigenvectors());
|
VERIFY_IS_UNITARY(eiSymm.eigenvectors());
|
||||||
|
|
||||||
@ -33,7 +43,6 @@ template<typename MatrixType> void selfadjointeigensolver_essential_check(const
|
|||||||
SelfAdjointEigenSolver<MatrixType> eiDirect;
|
SelfAdjointEigenSolver<MatrixType> eiDirect;
|
||||||
eiDirect.computeDirect(m);
|
eiDirect.computeDirect(m);
|
||||||
VERIFY_IS_EQUAL(eiDirect.info(), Success);
|
VERIFY_IS_EQUAL(eiDirect.info(), Success);
|
||||||
VERIFY_IS_APPROX(eiSymm.eigenvalues(), eiDirect.eigenvalues());
|
|
||||||
if(! eiSymm.eigenvalues().isApprox(eiDirect.eigenvalues(), eival_eps) )
|
if(! eiSymm.eigenvalues().isApprox(eiDirect.eigenvalues(), eival_eps) )
|
||||||
{
|
{
|
||||||
std::cerr << "reference eigenvalues: " << eiSymm.eigenvalues().transpose() << "\n"
|
std::cerr << "reference eigenvalues: " << eiSymm.eigenvalues().transpose() << "\n"
|
||||||
@ -41,10 +50,18 @@ template<typename MatrixType> void selfadjointeigensolver_essential_check(const
|
|||||||
<< "diff: " << (eiSymm.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";
|
<< "error (eps): " << (eiSymm.eigenvalues()-eiDirect.eigenvalues()).norm() / eiSymm.eigenvalues().norm() << " (" << eival_eps << ")\n";
|
||||||
}
|
}
|
||||||
VERIFY(eiSymm.eigenvalues().isApprox(eiDirect.eigenvalues(), eival_eps));
|
if(scaling<(std::numeric_limits<RealScalar>::min)())
|
||||||
VERIFY_IS_APPROX(m.template selfadjointView<Lower>() * eiDirect.eigenvectors(),
|
{
|
||||||
eiDirect.eigenvectors() * eiDirect.eigenvalues().asDiagonal());
|
VERIFY(eiDirect.eigenvalues().cwiseAbs().maxCoeff() <= (std::numeric_limits<RealScalar>::min)());
|
||||||
VERIFY_IS_APPROX(m.template selfadjointView<Lower>().eigenvalues(), eiDirect.eigenvalues());
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
VERIFY_IS_APPROX(eiSymm.eigenvalues()/scaling, eiDirect.eigenvalues()/scaling);
|
||||||
|
VERIFY_IS_APPROX((m.template selfadjointView<Lower>() * eiDirect.eigenvectors())/scaling,
|
||||||
|
(eiDirect.eigenvectors() * eiDirect.eigenvalues().asDiagonal())/scaling);
|
||||||
|
VERIFY_IS_APPROX(m.template selfadjointView<Lower>().eigenvalues()/scaling, eiDirect.eigenvalues()/scaling);
|
||||||
|
}
|
||||||
|
|
||||||
VERIFY_IS_UNITARY(eiDirect.eigenvectors());
|
VERIFY_IS_UNITARY(eiDirect.eigenvectors());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user