Mercurial > octave
diff liboctave/array/Array-util.cc @ 30902:972959edc3ff
Allow sub2ind() to accept indices outside the size of the input subscripts (bug #62184)
* NEWS.8.md: Announce change in Matlab Compatibility section.
* sub2ind.cc: Add '#include "utility"' for access to std::swap.
* sub2ind.cc (Fsub2ind): Check nargout to figure out ndims of output.
For special case of vector (1-dimension), put in code to guarantee a
row vector output. Add BIST tests for bug #62184. Remove input
validation BIST which no longer applies.
* Array-util.cc (ind2sub): Remove input validation requiring index to
be within range of subscript size. Adjust code to put all remaining
elements in the final output dimension.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Tue, 05 Apr 2022 15:12:34 -0700 |
parents | 796f54d4ddbf |
children | 597f3ee61a48 |
line wrap: on
line diff
--- a/liboctave/array/Array-util.cc Tue Apr 05 13:54:18 2022 -0700 +++ b/liboctave/array/Array-util.cc Tue Apr 05 15:12:34 2022 -0700 @@ -623,17 +623,16 @@ Array<octave::idx_vector> retval (dim_vector (n, 1)); octave_idx_type numel = dv.numel (); - if (idx.extent (numel) > numel) - (*current_liboctave_error_handler) ("ind2sub: index out of range"); - if (idx.is_scalar ()) { octave_idx_type k = idx(0); - for (octave_idx_type j = 0; j < n; j++) + for (octave_idx_type j = 0; j < n-1; j++) { retval(j) = k % dv(j); k /= dv(j); } + + retval(n-1) = idx(0) < numel ? k % dv(n-1) : k; } else { @@ -646,11 +645,13 @@ for (octave_idx_type i = 0; i < len; i++) { octave_idx_type k = idx(i); - for (octave_idx_type j = 0; j < n; j++) + for (octave_idx_type j = 0; j < n-1; j++) { rdata[j](i) = k % dv(j); k /= dv(j); } + + rdata[n-1](i) = idx(i) < numel ? k % dv(n-1) : k; } for (octave_idx_type j = 0; j < n; j++)