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 }