Mercurial > hg > octave-lyh
diff liboctave/Array.cc @ 8563:3a3421a9f0bb
optimize resizable indexing with scalars
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Thu, 22 Jan 2009 13:26:04 +0100 |
parents | 6b074f37e8d7 |
children | 188d38a553c7 |
line wrap: on
line diff
--- 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<T> (1, rfv); + else + tmp.resize_fill (nx, rfv); + } if (tmp.numel () != nx) return Array<T> (); @@ -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<T> (1, rfv); + else + tmp.resize_fill (rx, cx, rfv); + } if (tmp.rows () != rx || tmp.columns () != cx) return Array<T> (); @@ -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<T> (1, rfv); + else + tmp.resize_fill (dvx, rfv); + } if (tmp.dimensions != dvx) return Array<T> ();