diff options
author | Gael Guennebaud <g.gael@free.fr> | 2012-01-25 19:02:31 +0100 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2012-01-25 19:02:31 +0100 |
commit | a108216af168730df6e4b69ebe92128cb001f775 (patch) | |
tree | 874830816c97921f4a769709e16433277a749d31 | |
parent | 362fcabc440ad6404250fe83c7583367d99629d5 (diff) |
fix bug #410: fix a possible out of range access in EigenSolver
-rw-r--r-- | Eigen/src/Eigenvalues/EigenSolver.h | 2 | ||||
-rw-r--r-- | test/eigensolver_generic.cpp | 11 |
2 files changed, 12 insertions, 1 deletions
diff --git a/Eigen/src/Eigenvalues/EigenSolver.h b/Eigen/src/Eigenvalues/EigenSolver.h index 53b77385d..720a45bbc 100644 --- a/Eigen/src/Eigenvalues/EigenSolver.h +++ b/Eigen/src/Eigenvalues/EigenSolver.h @@ -339,7 +339,7 @@ typename EigenSolver<MatrixType>::EigenvectorsType EigenSolver<MatrixType>::eige EigenvectorsType matV(n,n); for (Index j=0; j<n; ++j) { - if (internal::isMuchSmallerThan(internal::imag(m_eivalues.coeff(j)), internal::real(m_eivalues.coeff(j)))) + if (internal::isMuchSmallerThan(internal::imag(m_eivalues.coeff(j)), internal::real(m_eivalues.coeff(j))) || j+1==n) { // we have a real eigen value matV.col(j) = m_eivec.col(j).template cast<ComplexScalar>(); diff --git a/test/eigensolver_generic.cpp b/test/eigensolver_generic.cpp index 96ff4f873..2e9cdc7a5 100644 --- a/test/eigensolver_generic.cpp +++ b/test/eigensolver_generic.cpp @@ -114,6 +114,17 @@ void test_eigensolver_generic() // Test problem size constructors CALL_SUBTEST_5(EigenSolver<MatrixXf>(s)); + + // regression test for bug 410 + CALL_SUBTEST_2( + { + MatrixXd A(1,1); + A(0,0) = std::sqrt(-1.); + Eigen::EigenSolver<MatrixXd> solver(A); + MatrixXd V(1, 1); + V(0,0) = solver.eigenvectors()(0,0).real(); + } + ); EIGEN_UNUSED_VARIABLE(s) } |