Reputation: 675
In Eigen 3.2 sparse matrices had a method named 'nonZeros' that returned the count of non-zero elements. This method seems to be gone in Eigen 3.3. How does one obtain the number of nonzero in 3.3?
Upvotes: 1
Views: 845
Reputation: 10596
It's still there. In Eigen/src/SparseCore/SparseCompressedBase.h
line 56 there is one definition (for SparseCompressedBase
).
template<typename Derived>
class SparseCompressedBase
: public SparseMatrixBase<Derived>
{
...
protected:
typedef typename Base::IndexVector IndexVector;
Eigen::Map<IndexVector> innerNonZeros() { return Eigen::Map<IndexVector>(innerNonZeroPtr(), isCompressed()?0:derived().outerSize()); }
const Eigen::Map<const IndexVector> innerNonZeros() const { return Eigen::Map<const IndexVector>(innerNonZeroPtr(), isCompressed()?0:derived().outerSize()); }
public:
/** \returns the number of non zero coefficients */
inline Index nonZeros() const
{
if(Derived::IsVectorAtCompileTime && outerIndexPtr()==0)
return derived().nonZeros();
More so, a quick grep shows all the definitions (v3.3.0):
$ grep -rn "Index nonZeros()" *
src/Core/DenseBase.h:210: inline Index nonZeros() const { return size(); }
src/SparseCore/AmbiVector.h:39: Index nonZeros() const;
src/SparseCore/SparseBlock.h:42: Index nonZeros() const
src/SparseCore/SparseBlock.h:436: Index nonZeros() const { return Dynamic; }
src/SparseCore/SparseCompressedBase.h:56: inline Index nonZeros() const
src/SparseCore/SparseMap.h:87: inline Index nonZeros() const { return m_zero_nnz[1]; }
src/SparseCore/SparseTranspose.h:31: inline Index nonZeros() const { return derived().nestedExpression().nonZeros(); }
src/SparseCore/SparseVector.h:140: inline Index nonZeros() const { return m_data.size(); }
Upvotes: 1