# HG changeset patch # User jwe # Date 1130560285 0 # Node ID 20b20fd070b0113e1577c0c0d601781ab05f6e27 # Parent a9bd6c31751fd818ad1bbeba3a83c0cc8e3b63b9 [project @ 2005-10-29 04:31:25 by jwe] diff -r a9bd6c31751f -r 20b20fd070b0 liboctave/Array-util.cc --- a/liboctave/Array-util.cc Sat Oct 29 04:28:23 2005 +0000 +++ b/liboctave/Array-util.cc Sat Oct 29 04:31:25 2005 +0000 @@ -219,15 +219,15 @@ } bool -vector_equivalent (const Array& ra_idx) +vector_equivalent (const dim_vector& dv) { - octave_idx_type n = ra_idx.length (); + int n = dv.length (); bool found_first = false; - for (octave_idx_type i = 0; i < n; i++) + for (int i = 0; i < n; i++) { - if (ra_idx(i) != 1) + if (dv(i) != 1) { if (! found_first) found_first = true; diff -r a9bd6c31751f -r 20b20fd070b0 liboctave/Array-util.h --- a/liboctave/Array-util.h Sat Oct 29 04:28:23 2005 +0000 +++ b/liboctave/Array-util.h Sat Oct 29 04:31:25 2005 +0000 @@ -55,7 +55,7 @@ extern dim_vector freeze (Array& ra_idx, const dim_vector& dimensions, int resize_ok); -extern bool vector_equivalent (const Array& ra_idx); +extern bool vector_equivalent (const dim_vector& dv); extern bool all_ok (const Array& ra_idx); diff -r a9bd6c31751f -r 20b20fd070b0 liboctave/Array.cc --- a/liboctave/Array.cc Sat Oct 29 04:28:23 2005 +0000 +++ b/liboctave/Array.cc Sat Oct 29 04:31:25 2005 +0000 @@ -2158,9 +2158,11 @@ { Array retval; - int n_dims = dims().length (); - - octave_idx_type orig_len = dims().numel (); + dim_vector dv = dims (); + + int n_dims = dv.length (); + + octave_idx_type orig_len = dv.numel (); dim_vector idx_orig_dims = ra_idx.orig_dimensions (); @@ -2170,90 +2172,40 @@ retval = Array (*this, dim_vector (orig_len, 1)); } - else if (length () == 1) - { - // Only one element in array. - - Array tmp = Array::index (ra_idx, resize_ok); - - octave_idx_type len = tmp.length (); - - if (len != 0) - { - if (len >= idx_orig_dims.numel ()) - retval = Array (tmp, idx_orig_dims); - } - else - retval = Array (tmp, dim_vector (0, 0)); - } - else if (vector_equivalent (dims ())) - { - // We're getting elements from a vector equivalent i.e. (1x4x1). - - Array tmp = Array::index (ra_idx, resize_ok); - - octave_idx_type len = tmp.length (); - - if (len == 0) - { - if (idx_orig_dims.any_zero ()) - retval = Array (idx_orig_dims); - else - { - dim_vector new_dims; - - new_dims.resize (n_dims); - - for (int i = 0; i < n_dims; i++) - { - if ((dims ())(i) == 1) - new_dims(i) = 1; - } - - new_dims.chop_trailing_singletons (); - - retval = Array (new_dims); - } - } - else - { - if (vector_equivalent (idx_orig_dims)) - { - // Array index (n_dims, len); - dim_vector new_dims; - - new_dims.resize (n_dims); - - for (int i = 0; i < n_dims; i++) - { - if ((dims ())(i) == 1) - new_dims(i) = 1; - } - - new_dims.chop_trailing_singletons (); - - retval = Array (tmp, new_dims); - } - else if (tmp.length () >= idx_orig_dims.numel ()) - retval = Array (tmp, idx_orig_dims); - - (*current_liboctave_error_handler) - ("I do not know what to do here yet!"); - } - } else { - if (liboctave_wfi_flag + bool vec_equiv = vector_equivalent (dv); + + if (! vec_equiv + && liboctave_wfi_flag && ! (ra_idx.is_colon () - || (ra_idx.one_zero_only () && idx_orig_dims == dims ()))) + || (ra_idx.one_zero_only () && idx_orig_dims == dv))) (*current_liboctave_warning_handler) ("single index used for N-d array"); - ra_idx.freeze (orig_len, "nd-array", resize_ok); + octave_idx_type frozen_len + = ra_idx.freeze (orig_len, "nd-array", resize_ok); if (ra_idx) { - dim_vector result_dims (idx_orig_dims); + dim_vector result_dims; + + if (vec_equiv) + { + result_dims = dv; + + for (int i = 0; i < n_dims; i++) + { + if (result_dims(i) != 1) + { + // All but this dim should be one. + result_dims(i) = frozen_len; + break; + } + } + } + else + result_dims = idx_orig_dims; if (ra_idx.one_zero_only ()) { @@ -2283,7 +2235,7 @@ retval.elem (iidx) = rfv; else { - Array temp = get_ra_idx (ii, dims ()); + Array temp = get_ra_idx (ii, dv); retval.elem (iidx) = elem (temp); } diff -r a9bd6c31751f -r 20b20fd070b0 liboctave/ChangeLog --- a/liboctave/ChangeLog Sat Oct 29 04:28:23 2005 +0000 +++ b/liboctave/ChangeLog Sat Oct 29 04:31:25 2005 +0000 @@ -1,3 +1,10 @@ +2005-10-29 John W. Eaton + + * Array.cc (Array::indexN): Simplify. Delete separate special + case for "vector_equivalent". + + * Array-util.cc (vector_equivalent): Arg is now dim_vector. + 2005-10-28 John W. Eaton * oct-sparse.h: Fix typo in HAVE_UFSPARSE_UMFPACK_H.