aboutsummaryrefslogtreecommitdiffhomepage
path: root/Eigen/src
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2011-02-06 08:23:10 +0100
committerGravatar Gael Guennebaud <g.gael@free.fr>2011-02-06 08:23:10 +0100
commitea998807605c50a83e12ced0c330c35cde9c242a (patch)
tree6bad3c82db5ca94eb19eb421eec512c00a8b96a7 /Eigen/src
parent9ce08b352fffb75769c91fa5e6eb619221ff2453 (diff)
fix under- and overflow
Diffstat (limited to 'Eigen/src')
-rw-r--r--Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h7
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;