# HG changeset patch # User Jaroslav Hajek # Date 1270638025 -7200 # Node ID e52f41fd82c74b8c81faaef91be73662c443ba86 # Parent 2f8bacc2a57d78ae343fa045cb7254ee8a9818b7 optimize (:) indexing of sparse column vectors diff --git a/liboctave/ChangeLog b/liboctave/ChangeLog --- a/liboctave/ChangeLog +++ b/liboctave/ChangeLog @@ -1,3 +1,8 @@ +2010-04-07 Jaroslav Hajek + + * Sparse.cc (Sparse::index (const idx_vector&, bool)): Use shallow + copy when column is indexed by colon. + 2010-04-07 Jaroslav Hajek * Sparse.cc (lblookup): Move in front of Sparse::delete_elements. diff --git a/liboctave/Sparse.cc b/liboctave/Sparse.cc --- a/liboctave/Sparse.cc +++ b/liboctave/Sparse.cc @@ -1472,20 +1472,25 @@ ("cannot index sparse matrix with an N-D Array"); else if (idx.is_colon ()) { - // Fast magic colon processing. - retval = Sparse (nel, 1, nz); - - for (octave_idx_type i = 0; i < nc; i++) + if (nc == 1) + retval = *this; + else { - for (octave_idx_type j = cidx(i); j < cidx(i+1); j++) + // Fast magic colon processing. + retval = Sparse (nel, 1, nz); + + for (octave_idx_type i = 0; i < nc; i++) { - retval.xdata(j) = data(j); - retval.xridx(j) = ridx(j) + i * nr; + for (octave_idx_type j = cidx(i); j < cidx(i+1); j++) + { + retval.xdata(j) = data(j); + retval.xridx(j) = ridx(j) + i * nr; + } } + + retval.xcidx(0) = 0; + retval.xcidx(1) = nz; } - - retval.xcidx(0) = 0; - retval.xcidx(1) = nz; } else if (idx.extent (nel) > nel) {