Mercurial > octave-nkf
diff liboctave/array/idx-vector.cc @ 16779:8fce0ed4894a
Specialize is_empty and numel methods for sparse matrices (debian bug #706376)
* ov-base.h (virtual bool is_empty (void) const) : Make method virtual
* ov-base-sparse.h (bool is_empty (void) const)) : Declare new method
(octave_idx_type numel (void) const): New method.
* ov-base-sparse.cc (template <class T> bool octave_base_sparse<T>:is_empty
(void) const)) : Define new method
* ov-bool-sparse.h (idx_vector index_vector (void) const): Start specialization
for sparse matrices
* lo-array-gripes.cc (void gripe_index_value (void)): Clarify error message
* data.cc : Add test to isempty
* idx-vector.cc (idx_vector::idx_vector_rep::idx_vector_rep (const
Sparse<bool>&) : Fix sparse indexing bug
* __sprand_impl__.m : Don't use randparm when there are more than sizemax() elements.
* sprand.m, sprandn.m : Add a test for large, low density matrices
author | David Bateman <dbateman@free.fr> |
---|---|
date | Thu, 20 Jun 2013 02:17:25 +0200 |
parents | 648dabbb4c6b |
children | d63878346099 |
line wrap: on
line diff
--- a/liboctave/array/idx-vector.cc Wed Jun 19 16:51:30 2013 -0700 +++ b/liboctave/array/idx-vector.cc Thu Jun 20 02:17:25 2013 +0200 @@ -423,30 +423,27 @@ } idx_vector::idx_vector_rep::idx_vector_rep (const Sparse<bool>& bnda) - : data (0), len (0), ext (0), aowner (0), orig_dims () + : data (0), len (bnda.nnz ()), ext (0), aowner (0), orig_dims () { - for (octave_idx_type i = 0, l = bnda.nnz (); i < l; i++) - if (bnda.data (i)) len++; + const dim_vector dv = bnda.dims (); - dim_vector dv = bnda.dims (); - - orig_dims = ((dv.length () == 2 && dv(0) == 1) - ? dim_vector (1, len) : orig_dims = dim_vector (len, 1)); + if (! dv.all_zero ()) + orig_dims = ((dv.length () == 2 && dv(0) == 1) + ? dim_vector (1, len) : dim_vector (len, 1)); if (len != 0) { octave_idx_type *d = new octave_idx_type [len]; - octave_idx_type nnz = bnda.nnz (); + octave_idx_type k = 0; + octave_idx_type nc = bnda.cols (); + octave_idx_type nr = bnda.rows (); - octave_idx_type k = 0; - // FIXME: I hope this is OK, i.e. the element iterated this way are correctly ordered. - for (octave_idx_type i = 0; i < nnz; i++) - { + for (octave_idx_type j = 0; j < nc; j++) + for (octave_idx_type i = bnda.cidx(j); i < bnda.cidx(j+1); i++) if (bnda.data (i)) - d[k++] = bnda.cidx (i) + bnda.rows () * bnda.ridx (i); - } - + d[k++] = j * nr + bnda.ridx (i); + data = d; ext = d[k-1] + 1;