diff options
author | 2020-07-22 01:38:30 +0000 | |
---|---|---|
committer | 2020-07-22 01:38:30 +0000 | |
commit | acab22c205a15d5c865981f4d0876899591138d4 (patch) | |
tree | 20df655bb6568cddb26873e8bb11e7de5283c1c1 /Eigen | |
parent | ac2eca6b113cee17fc17b39dd2acdf861f8b139b (diff) |
Avoid division by zero in nonZerosEstimate() for empty blocks.
Diffstat (limited to 'Eigen')
-rw-r--r-- | Eigen/src/SparseCore/SparseBlock.h | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/Eigen/src/SparseCore/SparseBlock.h b/Eigen/src/SparseCore/SparseBlock.h index db5090257..5b4f6cc9f 100644 --- a/Eigen/src/SparseCore/SparseBlock.h +++ b/Eigen/src/SparseCore/SparseBlock.h @@ -446,9 +446,13 @@ struct unary_evaluator<Block<ArgType,BlockRows,BlockCols,InnerPanel>, IteratorBa {} inline Index nonZerosEstimate() const { - Index nnz = m_block.nonZeros(); - if(nnz<0) - return m_argImpl.nonZerosEstimate() * m_block.size() / m_block.nestedExpression().size(); + const Index nnz = m_block.nonZeros(); + if(nnz < 0) { + // Scale the non-zero estimate for the underlying expression linearly with block size. + // Return zero if the underlying block is empty. + const Index nested_sz = m_block.nestedExpression().size(); + return nested_sz == 0 ? 0 : m_argImpl.nonZerosEstimate() * m_block.size() / nested_sz; + } return nnz; } |