mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-09-13 01:43:13 +08:00
Fix crash in IncompleteCholesky when the input has zeros on the diagonal.
This commit is contained in:
parent
3859e8d5b2
commit
6ed4d80cc8
@ -214,6 +214,19 @@ void IncompleteCholesky<Scalar, UpLo_, OrderingType>::factorize(const MatrixType
|
||||
m_L.template selfadjointView<Lower>() = mat.template selfadjointView<UpLo_>();
|
||||
}
|
||||
|
||||
// The algorithm will insert increasingly large shifts on the diagonal until
|
||||
// factorization succeeds. Therefore we have to make sure that there is a
|
||||
// space in the datastructure to store such values, even if the original
|
||||
// matrix has a zero on the diagonal.
|
||||
bool modified = false;
|
||||
for (Index i = 0; i < mat.cols(); ++i) {
|
||||
if (numext::is_exactly_zero(m_L.coeff(i, i))) {
|
||||
m_L.insert(i, i) = Scalar(0);
|
||||
modified = true;
|
||||
}
|
||||
}
|
||||
if (modified) m_L.makeCompressed();
|
||||
|
||||
Index n = m_L.cols();
|
||||
Index nnz = m_L.nonZeros();
|
||||
Map<VectorSx> vals(m_L.valuePtr(), nnz); // values
|
||||
|
Loading…
x
Reference in New Issue
Block a user