aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2012-01-25 19:02:31 +0100
committerGravatar Gael Guennebaud <g.gael@free.fr>2012-01-25 19:02:31 +0100
commita108216af168730df6e4b69ebe92128cb001f775 (patch)
tree874830816c97921f4a769709e16433277a749d31
parent362fcabc440ad6404250fe83c7583367d99629d5 (diff)
fix bug #410: fix a possible out of range access in EigenSolver
-rw-r--r--Eigen/src/Eigenvalues/EigenSolver.h2
-rw-r--r--test/eigensolver_generic.cpp11
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)
}