aboutsummaryrefslogtreecommitdiffhomepage
path: root/Eigen/src
diff options
context:
space:
mode:
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;