# HG changeset patch # User jwe # Date 1173257256 0 # Node ID 4109a238634692b442ad03d8bbd8a869a29246be # Parent 24666a9192f2da9469d27b4cdd07ce3a1eb63f24 [project @ 2007-03-07 08:47:36 by jwe] diff -r 24666a9192f2 -r 4109a2386346 liboctave/Array.cc --- a/liboctave/Array.cc Wed Mar 07 08:43:04 2007 +0000 +++ b/liboctave/Array.cc Wed Mar 07 08:47:36 2007 +0000 @@ -1679,6 +1679,8 @@ dim_vector lhs_dims = dims (); + int n_lhs_dims = lhs_dims.length (); + if (lhs_dims.all_zero ()) return; @@ -1688,7 +1690,24 @@ return; } - int n_lhs_dims = lhs_dims.length (); + if (n_idx > n_lhs_dims) + { + for (int i = n_idx; i < n_lhs_dims; i++) + { + // Ensure that extra indices are either colon or 1. + + if (! ra_idx(i).is_colon_equiv (1, 1)) + { + (*current_liboctave_error_handler) + ("index exceeds array dimensions"); + return; + } + } + + ra_idx.resize (n_lhs_dims); + + n_idx = n_lhs_dims; + } Array idx_is_colon (n_idx, 0); @@ -2466,47 +2485,18 @@ int assign (Array& lhs, const Array& rhs, const LT& rfv) { - int retval = 0; - - switch (lhs.ndims ()) - { - case 0: - { - if (lhs.index_count () < 3) - { - // kluge... - lhs.resize_no_fill (0, 0); - retval = assign2 (lhs, rhs, rfv); - } - else - retval = assignN (lhs, rhs, rfv); - } - break; - - case 1: - { - if (lhs.index_count () > 1) - retval = assignN (lhs, rhs, rfv); - else - retval = assign1 (lhs, rhs, rfv); - } - break; - - case 2: - { - if (lhs.index_count () > 2) - retval = assignN (lhs, rhs, rfv); - else - retval = assign2 (lhs, rhs, rfv); - } - break; - - default: - retval = assignN (lhs, rhs, rfv); - break; - } - - return retval; + int n_idx = lhs.index_count (); + + // kluge... + if (lhs.ndims () == 0) + lhs.resize_no_fill (0, 0); + + return (lhs.ndims () == 2 + && (n_idx == 1 + || (n_idx < 3 + && rhs.ndims () == 2 + && rhs.rows () == 0 && rhs.columns () == 0))) + ? assign2 (lhs, rhs, rfv) : assignN (lhs, rhs, rfv); } template @@ -3067,16 +3057,17 @@ octave_idx_type nelem = idx(i).capacity (); if (nelem >= 1 - && k < rhs_dims.length () && nelem == rhs_dims(k)) + && ((k < rhs_dims.length () && nelem == rhs_dims(k)) + || rhs_is_scalar)) k++; - else if (nelem != 1) + else if (! (nelem == 1 || rhs_is_scalar)) { (*current_liboctave_error_handler) ("A(IDX-LIST) = RHS: mismatched index and RHS dimension"); return retval; } - new_dims(i) = idx(i).max () + 1; + new_dims(i) = idx(i).orig_empty () ? 0 : idx(i).max () + 1; } } } @@ -3154,19 +3145,53 @@ if (! final_lhs_dims.any_zero ()) { - octave_idx_type n = Array::get_size (frozen_len); - - Array result_idx (lhs_dims_len, 0); - RT scalar = rhs.elem (0); - for (octave_idx_type i = 0; i < n; i++) + if (n_idx == 1) + { + idx_vector iidx = idx(0); + + octave_idx_type len = frozen_len(0); + + for (octave_idx_type i = 0; i < len; i++) + { + octave_idx_type ii = iidx.elem (i); + + lhs.elem (ii) = scalar; + } + } + else if (lhs_dims_len == 2 && n_idx == 2) { - Array elt_idx = get_elt_idx (idx, result_idx); - - lhs.elem (elt_idx) = scalar; - - increment_index (result_idx, frozen_len); + idx_vector idx_i = idx(0); + idx_vector idx_j = idx(1); + + octave_idx_type i_len = frozen_len(0); + octave_idx_type j_len = frozen_len(1); + + for (octave_idx_type j = 0; j < j_len; j++) + { + octave_idx_type jj = idx_j.elem (j); + for (octave_idx_type i = 0; i < i_len; i++) + { + octave_idx_type ii = idx_i.elem (i); + lhs.elem (ii, jj) = scalar; + } + } + } + else + { + octave_idx_type n = Array::get_size (frozen_len); + + Array result_idx (lhs_dims_len, 0); + + for (octave_idx_type i = 0; i < n; i++) + { + Array elt_idx = get_elt_idx (idx, result_idx); + + lhs.elem (elt_idx) = scalar; + + increment_index (result_idx, frozen_len); + } } } } @@ -3192,17 +3217,52 @@ if (! final_lhs_dims.any_zero ()) { - n = Array::get_size (frozen_len); - - Array result_idx (lhs_dims_len, 0); - - for (octave_idx_type i = 0; i < n; i++) + if (n_idx == 1) + { + idx_vector iidx = idx(0); + + octave_idx_type len = frozen_len(0); + + for (octave_idx_type i = 0; i < len; i++) + { + octave_idx_type ii = iidx.elem (i); + + lhs.elem (ii) = rhs.elem (i); + } + } + else if (lhs_dims_len == 2 && n_idx == 2) { - Array elt_idx = get_elt_idx (idx, result_idx); - - lhs.elem (elt_idx) = rhs.elem (i); - - increment_index (result_idx, frozen_len); + idx_vector idx_i = idx(0); + idx_vector idx_j = idx(1); + + octave_idx_type i_len = frozen_len(0); + octave_idx_type j_len = frozen_len(1); + octave_idx_type k = 0; + + for (octave_idx_type j = 0; j < j_len; j++) + { + octave_idx_type jj = idx_j.elem (j); + for (octave_idx_type i = 0; i < i_len; i++) + { + octave_idx_type ii = idx_i.elem (i); + lhs.elem (ii, jj) = rhs.elem (k++); + } + } + } + else + { + n = Array::get_size (frozen_len); + + Array result_idx (lhs_dims_len, 0); + + for (octave_idx_type i = 0; i < n; i++) + { + Array elt_idx = get_elt_idx (idx, result_idx); + + lhs.elem (elt_idx) = rhs.elem (i); + + increment_index (result_idx, frozen_len); + } } } } diff -r 24666a9192f2 -r 4109a2386346 liboctave/ChangeLog --- a/liboctave/ChangeLog Wed Mar 07 08:43:04 2007 +0000 +++ b/liboctave/ChangeLog Wed Mar 07 08:47:36 2007 +0000 @@ -1,13 +1,12 @@ -2007-03-06 John W. Eaton - - * Array.cc (assign1, assign2): For assignments like x(:,1) = 1 or - x(:) = 1, only resize if X is 0x0. - (assign2): Use single loop for x(:) = nonempty_rhs case. - If single index and rhs is 0x0, always call maybe_delete_elements - on lhs. - (Array::maybe_delete_elements (Array&, const T&)): - Quick return of [] if doing x(:) = []. - +2007-03-07 John W. Eaton + + * Array.cc (Array::maybe_delete_elements (Array&, + const T&)): Handle case of more indices than dimensions. + (assign (Array&, const Array&, const LT&)): Allow more + cases to be handled by assignN. + (assignN (Array&, const Array&, const LT&)): + Special cases for 2-d array assignments for speed. + Improve handling of scalar RHS and empty indices. 2007-03-05 David Bateman