mirror of
https://gitlab.com/libeigen/eigen.git
synced 2026-04-10 11:34:33 +08:00
fix under- and overflow
This commit is contained in:
@@ -400,7 +400,9 @@ SelfAdjointEigenSolver<MatrixType>& SelfAdjointEigenSolver<MatrixType>
|
|||||||
RealVectorType& diag = m_eivalues;
|
RealVectorType& diag = m_eivalues;
|
||||||
MatrixType& mat = m_eivec;
|
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);
|
m_subdiag.resize(n-1);
|
||||||
internal::tridiagonalization_inplace(mat, diag, m_subdiag, computeEigenvectors);
|
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_isInitialized = true;
|
||||||
m_eigenvectorsOk = computeEigenvectors;
|
m_eigenvectorsOk = computeEigenvectors;
|
||||||
return *this;
|
return *this;
|
||||||
|
|||||||
Reference in New Issue
Block a user