# HG changeset patch # User Jaroslav Hajek # Date 1259309421 -3600 # Node ID ead4f9c82a9abf4b3150a0097fef8d408d7071fa # Parent cac3b4e5035b79bf58b7c891dcb49b831b511db6 implement Array::nnz diff --git a/liboctave/Array.cc b/liboctave/Array.cc --- a/liboctave/Array.cc +++ b/liboctave/Array.cc @@ -2425,6 +2425,20 @@ } template +octave_idx_type +Array::nnz (void) const +{ + const T *src = data (); + octave_idx_type nel = nelem (), retval = 0; + const T zero = T (); + for (octave_idx_type i = 0; i < nel; i++) + if (src[i] != zero) + retval++; + + return retval; +} + +template Array Array::find (octave_idx_type n, bool backward) const { @@ -2693,6 +2707,10 @@ template <> Array \ Array::lookupb (const Array&, sortmode) const \ { return Array (); } \ + \ +template <> octave_idx_type \ +Array::nnz (void) const\ +{ return 0; } \ template <> Array \ Array::find (octave_idx_type, bool) const\ { return Array (); } \ diff --git a/liboctave/Array.h b/liboctave/Array.h --- a/liboctave/Array.h +++ b/liboctave/Array.h @@ -641,6 +641,9 @@ // This looks up only exact matches, returning true/false if match. Array lookupb (const Array& values, sortmode mode = UNSORTED) const; + // Count nonzero elements. + octave_idx_type nnz (void) const; + // Find indices of (at most n) nonzero elements. If n is specified, backward // specifies search from backward. Array find (octave_idx_type n = -1, bool backward = false) const; diff --git a/liboctave/ChangeLog b/liboctave/ChangeLog --- a/liboctave/ChangeLog +++ b/liboctave/ChangeLog @@ -1,3 +1,11 @@ +2009-11-27 Jaroslav Hajek + + * Array.cc (Array::nnz): New method. + * Array.h: Declare it. + * MArray.h (MArray::nnz): Remove. + * MArrayN.h (MArrayN::nnz): Remove. + * boolNDArray.h (boolNDArray::nnz): Remove. + 2009-11-25 Jaroslav Hajek * dbleCHOL.cc (CHOL::init): Output LAPACK's info. Resize matrix if diff --git a/liboctave/MArray.h b/liboctave/MArray.h --- a/liboctave/MArray.h +++ b/liboctave/MArray.h @@ -73,23 +73,6 @@ MArray transpose (void) const { return Array::transpose (); } MArray hermitian (T (*fcn) (const T&) = 0) const { return Array::hermitian (fcn); } - octave_idx_type nnz (void) const - { - octave_idx_type retval = 0; - - const T *d = this->data (); - - octave_idx_type nel = this->numel (); - - for (octave_idx_type i = 0; i < nel; i++) - { - if (d[i] != T ()) - retval++; - } - - return retval; - } - double norm (double p) const; float norm (float p) const; diff --git a/liboctave/MArrayN.h b/liboctave/MArrayN.h --- a/liboctave/MArrayN.h +++ b/liboctave/MArrayN.h @@ -70,23 +70,6 @@ return *this; } - octave_idx_type nnz (void) const - { - octave_idx_type retval = 0; - - const T *d = this->data (); - - octave_idx_type nel = this->numel (); - - for (octave_idx_type i = 0; i < nel; i++) - { - if (d[i] != T ()) - retval++; - } - - return retval; - } - MArrayN reshape (const dim_vector& new_dims) const { return Array::reshape (new_dims); } diff --git a/liboctave/boolNDArray.h b/liboctave/boolNDArray.h --- a/liboctave/boolNDArray.h +++ b/liboctave/boolNDArray.h @@ -101,23 +101,6 @@ // bool all_elements_are_real (void) const; // bool all_integers (double& max_val, double& min_val) const; - octave_idx_type nnz (void) const - { - octave_idx_type retval = 0; - - const bool *d = this->data (); - - octave_idx_type nel = this->numel (); - - for (octave_idx_type i = 0; i < nel; i++) - { - if (d[i]) - retval++; - } - - return retval; - } - boolNDArray diag (octave_idx_type k = 0) const; private: