Mercurial > hg > octave-nkf
diff liboctave/Array.cc @ 7642:9a4541c622b5
refactor Array::assignN dimensioning code for empty initial matrices
author | David Bateman <dbateman@free.fr> |
---|---|
date | Tue, 25 Mar 2008 23:06:45 -0400 |
parents | 36594d5bbe13 |
children | ad16ea379d2f |
line wrap: on
line diff
--- a/liboctave/Array.cc +++ b/liboctave/Array.cc @@ -3351,35 +3351,94 @@ if (orig_empty) { - int k = 0; - for (int i = 0; i < n_idx; i++) + if (rhs_is_scalar) + { + for (int i = 0; i < n_idx; i++) + { + if (idx(i).is_colon ()) + new_dims(i) = 1; + else + new_dims(i) = idx(i).orig_empty () ? 0 : idx(i).max () + 1; + } + } + else if (is_vector (rhs_dims)) { - // If index is a colon, resizing to RHS dimensions is - // allowed because we started out empty. - - if (idx(i).is_colon ()) + int ncolon = 0; + int fcolon = 0; + int lcolon = 0; + for (int i = 0; i < n_idx; i++) + if (idx(i).is_colon ()) + { + ncolon ++; + if (ncolon == 1) + fcolon = i; + lcolon = i; + new_dims (i) = 1; + } + else + new_dims (i) = idx(i).capacity (); + + if (ncolon == n_idx) { - if (k < rhs_dims.length ()) - new_dims(i) = rhs_dims(k++); - else - new_dims(i) = 1; + new_dims = rhs_dims; + new_dims.resize (n_idx); + for (int i = rhs_dims_len; i < n_idx; i++) + new_dims (i) = 1; } else { - octave_idx_type nelem = idx(i).capacity (); - - if (nelem >= 1 - && ((k < rhs_dims.length () && nelem == rhs_dims(k)) - || rhs_is_scalar) || ! idx(i).is_colon()) - k++; - else if (! (nelem == 1 || rhs_is_scalar)) + octave_idx_type new_dims_numel = new_dims.numel (); + octave_idx_type rhs_dims_numel = rhs_dims.numel (); + bool is_vec = is_vector (new_dims); + + for (int i = 0; i < n_idx; i++) + new_dims(i) = idx(i).orig_empty () ? 0 : idx(i).max () + 1; + + if (new_dims_numel != rhs_dims_numel && + ncolon > 0 && new_dims_numel == 1) + { + if (ncolon == 2 && rhs_dims_len == 2 && + rhs_dims(0) == 1) + new_dims (lcolon) = rhs_dims_numel; + else + new_dims (fcolon) = rhs_dims_numel; + } + else if (new_dims_numel != rhs_dims_numel || !is_vec) { (*current_liboctave_error_handler) ("A(IDX-LIST) = RHS: mismatched index and RHS dimension"); return retval; } - - new_dims(i) = idx(i).orig_empty () ? 0 : idx(i).max () + 1; + } + } + else + { + int k = 0; + for (int i = 0; i < n_idx; i++) + { + if (idx(i).is_colon ()) + { + if (k < rhs_dims_len) + new_dims(i) = rhs_dims(k++); + else + new_dims(i) = 1; + } + else + { + octave_idx_type nelem = idx(i).capacity (); + + if (nelem >= 1 + && (k < rhs_dims_len && nelem == rhs_dims(k))) + k++; + else if (nelem != 1) + { + (*current_liboctave_error_handler) + ("A(IDX-LIST) = RHS: mismatched index and RHS dimension"); + return retval; + } + new_dims(i) = idx(i).orig_empty () ? 0 : + idx(i).max () + 1; + } } } }