Avoid memory allocation in tridiagonalization_inplace_selector::run.

This commit is contained in:
Rasmus Munk Larsen
2021-08-06 20:48:10 +00:00
parent ae2abe1f58
commit a5a7faeb45
2 changed files with 16 additions and 11 deletions

View File

@@ -125,6 +125,7 @@ template<typename MatrixType_> class SelfAdjointEigenSolver
: m_eivec(),
m_eivalues(),
m_subdiag(),
m_hcoeffs(),
m_info(InvalidInput),
m_isInitialized(false),
m_eigenvectorsOk(false)
@@ -147,6 +148,7 @@ template<typename MatrixType_> class SelfAdjointEigenSolver
: m_eivec(size, size),
m_eivalues(size),
m_subdiag(size > 1 ? size - 1 : 1),
m_hcoeffs(size > 1 ? size - 1 : 1),
m_isInitialized(false),
m_eigenvectorsOk(false)
{}
@@ -172,6 +174,7 @@ template<typename MatrixType_> class SelfAdjointEigenSolver
: m_eivec(matrix.rows(), matrix.cols()),
m_eivalues(matrix.cols()),
m_subdiag(matrix.rows() > 1 ? matrix.rows() - 1 : 1),
m_hcoeffs(matrix.cols() > 1 ? matrix.cols() - 1 : 1),
m_isInitialized(false),
m_eigenvectorsOk(false)
{
@@ -378,6 +381,7 @@ template<typename MatrixType_> class SelfAdjointEigenSolver
EigenvectorsType m_eivec;
RealVectorType m_eivalues;
typename TridiagonalizationType::SubDiagonalType m_subdiag;
typename TridiagonalizationType::CoeffVectorType m_hcoeffs;
ComputationInfo m_info;
bool m_isInitialized;
bool m_eigenvectorsOk;
@@ -450,7 +454,8 @@ SelfAdjointEigenSolver<MatrixType>& SelfAdjointEigenSolver<MatrixType>
if(scale==RealScalar(0)) scale = RealScalar(1);
mat.template triangularView<Lower>() /= scale;
m_subdiag.resize(n-1);
internal::tridiagonalization_inplace(mat, diag, m_subdiag, computeEigenvectors);
m_hcoeffs.resize(n-1);
internal::tridiagonalization_inplace(mat, diag, m_subdiag, m_hcoeffs, computeEigenvectors);
m_info = internal::computeFromTridiagonal_impl(diag, m_subdiag, m_maxIterations, computeEigenvectors, m_eivec);