From ea998807605c50a83e12ced0c330c35cde9c242a Mon Sep 17 00:00:00 2001 From: Gael Guennebaud Date: Sun, 6 Feb 2011 08:23:10 +0100 Subject: fix under- and overflow --- Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'Eigen/src') diff --git a/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h b/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h index 3f3b08193..71084346b 100644 --- a/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +++ b/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h @@ -400,7 +400,9 @@ SelfAdjointEigenSolver& SelfAdjointEigenSolver RealVectorType& diag = m_eivalues; MatrixType& mat = m_eivec; - mat = matrix; + // map the matrix coefficients to [-1:1] to avoid over- and underflow. + RealScalar scale = matrix.cwiseAbs().maxCoeff(); + mat = matrix / scale; m_subdiag.resize(n-1); internal::tridiagonalization_inplace(mat, diag, m_subdiag, computeEigenvectors); @@ -457,6 +459,9 @@ SelfAdjointEigenSolver& SelfAdjointEigenSolver } } + // scale back the eigen values + m_eivalues *= scale; + m_isInitialized = true; m_eigenvectorsOk = computeEigenvectors; return *this; -- cgit v1.2.3