Mercurial > octave
changeset 32168:69723478e84d
Allow deletion assignments to non-existent dimensions for Matlab compatibility.
* Array-base.cc (delete_elements): Create temporary dim_vector "dimensions"
initially equal to "m_dimensions", but possibly resized to higher dimension.
Use "dimensions" in further calculations rather than raw member variable
"m_dimensions".
author | Rik <rik@octave.org> |
---|---|
date | Sun, 25 Jun 2023 17:14:52 -0700 |
parents | 59681cc864e7 |
children | 47cf72897a06 |
files | liboctave/array/Array-base.cc |
diffstat | 1 files changed, 13 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/liboctave/array/Array-base.cc Fri Jun 23 20:51:51 2023 +0200 +++ b/liboctave/array/Array-base.cc Sun Jun 25 17:14:52 2023 -0700 @@ -1446,10 +1446,17 @@ void Array<T, Alloc>::delete_elements (int dim, const octave::idx_vector& i) { - if (dim < 0 || dim >= ndims ()) + if (dim < 0) (*current_liboctave_error_handler) ("invalid dimension in delete_elements"); - octave_idx_type n = m_dimensions(dim); + dim_vector dimensions = m_dimensions; + + if (dim >= ndims ()) + dimensions.resize (dim + 1, 1); + + octave_idx_type ndim = dimensions.ndims (); + octave_idx_type n = dimensions(dim); + if (i.is_colon ()) { *this = Array<T, Alloc> (); @@ -1467,10 +1474,10 @@ octave_idx_type nd = n + l - u; octave_idx_type dl = 1; octave_idx_type du = 1; - dim_vector rdv = m_dimensions; + dim_vector rdv = dimensions; rdv(dim) = nd; - for (int k = 0; k < dim; k++) dl *= m_dimensions(k); - for (int k = dim + 1; k < ndims (); k++) du *= m_dimensions(k); + for (int k = 0; k < dim; k++) dl *= dimensions(k); + for (int k = dim + 1; k < ndim; k++) du *= dimensions(k); // Special case deleting a contiguous range. Array<T, Alloc> tmp = Array<T, Alloc> (rdv); @@ -1491,7 +1498,7 @@ else { // Use index. - Array<octave::idx_vector> ia (dim_vector (ndims (), 1), octave::idx_vector::colon); + Array<octave::idx_vector> ia (dim_vector (ndim, 1), octave::idx_vector::colon); ia (dim) = i.complement (n); *this = index (ia); }