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); | ||||
|   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_UNITARY(eiSymm.eigenvectors()); | ||||
| 
 | ||||
| @ -33,7 +43,6 @@ template<typename MatrixType> void selfadjointeigensolver_essential_check(const | ||||
|     SelfAdjointEigenSolver<MatrixType> 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" | ||||
| @ -41,10 +50,18 @@ template<typename MatrixType> void selfadjointeigensolver_essential_check(const | ||||
|                 << "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<Lower>() * eiDirect.eigenvectors(), | ||||
|                     eiDirect.eigenvectors() * eiDirect.eigenvalues().asDiagonal()); | ||||
|     VERIFY_IS_APPROX(m.template selfadjointView<Lower>().eigenvalues(), eiDirect.eigenvalues()); | ||||
|     if(scaling<(std::numeric_limits<RealScalar>::min)()) | ||||
|     { | ||||
|       VERIFY(eiDirect.eigenvalues().cwiseAbs().maxCoeff() <= (std::numeric_limits<RealScalar>::min)()); | ||||
|     } | ||||
|     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()); | ||||
|   } | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Gael Guennebaud
						Gael Guennebaud