# HG changeset patch # User Jaroslav Hajek # Date 1232627164 -3600 # Node ID 3a3421a9f0bbf34c39318e0f56afc19fcd882cfc # Parent a6edd5c23cb5e9c70c4ce78552d67ba0ccd3cfe2 optimize resizable indexing with scalars diff --git a/liboctave/Array.cc b/liboctave/Array.cc --- a/liboctave/Array.cc +++ b/liboctave/Array.cc @@ -1119,7 +1119,12 @@ { octave_idx_type n = numel (), nx = i.extent (n); if (n != nx) - tmp.resize_fill (nx, rfv); + { + if (i.is_scalar ()) + return Array (1, rfv); + else + tmp.resize_fill (nx, rfv); + } if (tmp.numel () != nx) return Array (); @@ -1140,7 +1145,12 @@ octave_idx_type r = dv(0), c = dv(1); octave_idx_type rx = i.extent (r), cx = j.extent (c); if (r != rx || c != cx) - tmp.resize_fill (rx, cx, rfv); + { + if (i.is_scalar () && j.is_scalar ()) + return Array (1, rfv); + else + tmp.resize_fill (rx, cx, rfv); + } if (tmp.rows () != rx || tmp.columns () != cx) return Array (); @@ -1162,7 +1172,15 @@ dim_vector dvx; dvx.resize (ial); for (int i = 0; i < ial; i++) dvx(i) = ia(i).extent (dv (i)); if (! (dvx == dv)) - tmp.resize_fill (dvx, rfv); + { + bool all_scalars = true; + for (int i = 0; i < ial; i++) + all_scalars = all_scalars && ia(i).is_scalar (); + if (all_scalars) + return Array (1, rfv); + else + tmp.resize_fill (dvx, rfv); + } if (tmp.dimensions != dvx) return Array (); diff --git a/liboctave/ChangeLog b/liboctave/ChangeLog --- a/liboctave/ChangeLog +++ b/liboctave/ChangeLog @@ -1,3 +1,8 @@ +2009-01-22 Jaroslav Hajek + + * Array.cc (Array::index (..., bool resize_ok)): + Optimize the all-scalar-indices cases. + 2009-01-22 Jaroslav Hajek * dbleQR.h: Optionally declare warn_qrupdate_once.