diff options
author | Gael Guennebaud <g.gael@free.fr> | 2011-02-06 08:23:10 +0100 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2011-02-06 08:23:10 +0100 |
commit | ea998807605c50a83e12ced0c330c35cde9c242a (patch) | |
tree | 6bad3c82db5ca94eb19eb421eec512c00a8b96a7 /Eigen/src | |
parent | 9ce08b352fffb75769c91fa5e6eb619221ff2453 (diff) |
fix under- and overflow
Diffstat (limited to 'Eigen/src')
-rw-r--r-- | Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h | 7 |
1 files changed, 6 insertions, 1 deletions
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<MatrixType>& SelfAdjointEigenSolver<MatrixType> 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<MatrixType>& SelfAdjointEigenSolver<MatrixType> } } + // scale back the eigen values + m_eivalues *= scale; + m_isInitialized = true; m_eigenvectorsOk = computeEigenvectors; return *this; |