Mercurial > hg > octave-lyh
comparison 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 |
comparison
equal
deleted
inserted
replaced
16778:e205f5ea826a | 16779:8fce0ed4894a |
---|---|
421 ext = d[k-1] + 1; | 421 ext = d[k-1] + 1; |
422 } | 422 } |
423 } | 423 } |
424 | 424 |
425 idx_vector::idx_vector_rep::idx_vector_rep (const Sparse<bool>& bnda) | 425 idx_vector::idx_vector_rep::idx_vector_rep (const Sparse<bool>& bnda) |
426 : data (0), len (0), ext (0), aowner (0), orig_dims () | 426 : data (0), len (bnda.nnz ()), ext (0), aowner (0), orig_dims () |
427 { | 427 { |
428 for (octave_idx_type i = 0, l = bnda.nnz (); i < l; i++) | 428 const dim_vector dv = bnda.dims (); |
429 if (bnda.data (i)) len++; | 429 |
430 | 430 if (! dv.all_zero ()) |
431 dim_vector dv = bnda.dims (); | 431 orig_dims = ((dv.length () == 2 && dv(0) == 1) |
432 | 432 ? dim_vector (1, len) : dim_vector (len, 1)); |
433 orig_dims = ((dv.length () == 2 && dv(0) == 1) | |
434 ? dim_vector (1, len) : orig_dims = dim_vector (len, 1)); | |
435 | 433 |
436 if (len != 0) | 434 if (len != 0) |
437 { | 435 { |
438 octave_idx_type *d = new octave_idx_type [len]; | 436 octave_idx_type *d = new octave_idx_type [len]; |
439 | 437 |
440 octave_idx_type nnz = bnda.nnz (); | |
441 | |
442 octave_idx_type k = 0; | 438 octave_idx_type k = 0; |
443 // FIXME: I hope this is OK, i.e. the element iterated this way are correctly ordered. | 439 octave_idx_type nc = bnda.cols (); |
444 for (octave_idx_type i = 0; i < nnz; i++) | 440 octave_idx_type nr = bnda.rows (); |
445 { | 441 |
442 for (octave_idx_type j = 0; j < nc; j++) | |
443 for (octave_idx_type i = bnda.cidx(j); i < bnda.cidx(j+1); i++) | |
446 if (bnda.data (i)) | 444 if (bnda.data (i)) |
447 d[k++] = bnda.cidx (i) + bnda.rows () * bnda.ridx (i); | 445 d[k++] = j * nr + bnda.ridx (i); |
448 } | 446 |
449 | |
450 data = d; | 447 data = d; |
451 | 448 |
452 ext = d[k-1] + 1; | 449 ext = d[k-1] + 1; |
453 } | 450 } |
454 } | 451 } |