Christopher Johnson
Christopher Johnson

Reputation: 675

Sparse matrix nonzero count in Eigen 3.3

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

Answers (1)

Avi Ginsburg
Avi Ginsburg

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

Related Questions