# HG changeset patch # User Jaroslav Hajek # Date 1228746808 -3600 # Node ID a99b9113c58c113803a9f6f0bbef5863a168aa70 # Parent a762d9daa700709e67fbdfe18506a5a572cc1940 optimize sparse bool indexing diff --git a/liboctave/ChangeLog b/liboctave/ChangeLog --- a/liboctave/ChangeLog +++ b/liboctave/ChangeLog @@ -1,3 +1,12 @@ +2008-12-08 Jaroslav Hajek + + * idx-vector.cc (idx_vector::idx_vector_rep::idx_vector_rep (const + Sparse&)): New constructor. + * idx_vector.h: Declare it. + (idx_vector::idx_vector (const Sparse&)): New constructor. + * idx-vector.cc (idx_vector::idx_vector_rep::idx_vector_rep (const + Array&)): Fix extent calculation. + 2008-12-07 Jaroslav Hajek * mx-inlines.cc (mx_inline_fill_vs): New template function. diff --git a/liboctave/idx-vector.cc b/liboctave/idx-vector.cc --- a/liboctave/idx-vector.cc +++ b/liboctave/idx-vector.cc @@ -32,6 +32,7 @@ #include "idx-vector.h" #include "Array.h" +#include "Sparse.h" #include "Range.h" #include "oct-locbuf.h" @@ -312,7 +313,38 @@ data = d; - ext = k; + ext = d[k-1] + 1; + } +} + +idx_vector::idx_vector_rep::idx_vector_rep (const Sparse& bnda) + : data (0), len (0), ext (0), aowner (0), orig_dims () +{ + for (octave_idx_type i = 0, l = bnda.nnz (); i < l; i++) + if (bnda.data (i)) len++; + + dim_vector dv = bnda.dims (); + + orig_dims = ((dv.length () == 2 && dv(0) == 1) + ? dim_vector (1, len) : orig_dims = 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; + // 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++) + { + if (bnda.data (i)) + d[k++] = bnda.cidx (i) + bnda.rows () * bnda.ridx (i); + } + + data = d; + + ext = d[k-1] + 1; } } diff --git a/liboctave/idx-vector.h b/liboctave/idx-vector.h --- a/liboctave/idx-vector.h +++ b/liboctave/idx-vector.h @@ -33,6 +33,7 @@ #include "oct-inttypes.h" template class Array; +template class Sparse; class Range; // Design rationale: @@ -270,6 +271,8 @@ idx_vector_rep (const Array&); + idx_vector_rep (const Sparse&); + ~idx_vector_rep (void); octave_idx_type xelem (octave_idx_type i) const @@ -397,6 +400,9 @@ : rep (new idx_range_rep (r)) { chkerr (); } + idx_vector (const Sparse& nda) : rep (new idx_vector_rep (nda)) + { chkerr (); } + idx_vector (const idx_vector& a) : rep (a.rep) { rep->count++; } ~idx_vector (void)