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);
         }