mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-08-12 19:59:05 +08:00
Fix dynamic allocation in JacobiSVD (regression)
This commit is contained in:
parent
e0a8615b94
commit
30c849669d
@ -628,6 +628,7 @@ template<typename _MatrixType, int QRPreconditioner> class JacobiSVD
|
|||||||
|
|
||||||
internal::qr_preconditioner_impl<MatrixType, QRPreconditioner, internal::PreconditionIfMoreColsThanRows> m_qr_precond_morecols;
|
internal::qr_preconditioner_impl<MatrixType, QRPreconditioner, internal::PreconditionIfMoreColsThanRows> m_qr_precond_morecols;
|
||||||
internal::qr_preconditioner_impl<MatrixType, QRPreconditioner, internal::PreconditionIfMoreRowsThanCols> m_qr_precond_morerows;
|
internal::qr_preconditioner_impl<MatrixType, QRPreconditioner, internal::PreconditionIfMoreRowsThanCols> m_qr_precond_morerows;
|
||||||
|
MatrixType m_scaledMatrix;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename MatrixType, int QRPreconditioner>
|
template<typename MatrixType, int QRPreconditioner>
|
||||||
@ -676,6 +677,7 @@ void JacobiSVD<MatrixType, QRPreconditioner>::allocate(Index rows, Index cols, u
|
|||||||
|
|
||||||
if(m_cols>m_rows) m_qr_precond_morecols.allocate(*this);
|
if(m_cols>m_rows) m_qr_precond_morecols.allocate(*this);
|
||||||
if(m_rows>m_cols) m_qr_precond_morerows.allocate(*this);
|
if(m_rows>m_cols) m_qr_precond_morerows.allocate(*this);
|
||||||
|
if(m_cols!=m_cols) m_scaledMatrix.resize(rows,cols);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename MatrixType, int QRPreconditioner>
|
template<typename MatrixType, int QRPreconditioner>
|
||||||
@ -698,7 +700,13 @@ JacobiSVD<MatrixType, QRPreconditioner>::compute(const MatrixType& matrix, unsig
|
|||||||
|
|
||||||
/*** step 1. The R-SVD step: we use a QR decomposition to reduce to the case of a square matrix */
|
/*** step 1. The R-SVD step: we use a QR decomposition to reduce to the case of a square matrix */
|
||||||
|
|
||||||
if(!m_qr_precond_morecols.run(*this, matrix/scale) && !m_qr_precond_morerows.run(*this, matrix/scale))
|
if(m_rows!=m_cols)
|
||||||
|
{
|
||||||
|
m_scaledMatrix = matrix / scale;
|
||||||
|
m_qr_precond_morecols.run(*this, m_scaledMatrix);
|
||||||
|
m_qr_precond_morerows.run(*this, m_scaledMatrix);
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
m_workMatrix = matrix.block(0,0,m_diagSize,m_diagSize) / scale;
|
m_workMatrix = matrix.block(0,0,m_diagSize,m_diagSize) / scale;
|
||||||
if(m_computeFullU) m_matrixU.setIdentity(m_rows,m_rows);
|
if(m_computeFullU) m_matrixU.setIdentity(m_rows,m_rows);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user