changeset 31928:a8473e7db0f4

Re-use linspace code for scalars for computing linspace of vectors. Delete hand-rolled code for linspace of vectors which was not sophisticated and missed corner cases, and instead re-use existing code for scalars. * CMatrix.cc, dMatrix.cc, fCMatrix.cc, fMatrix.cc (linspace): Use a for loop to call linspace for scalars with each element from the vector input. Aggregate the resulting row vectors into a return matrix.
author Rik <rik@octave.org>
date Fri, 24 Mar 2023 15:43:28 -0700
parents fef004fa8575
children 40b77efa1c7b
files liboctave/array/CMatrix.cc liboctave/array/dMatrix.cc liboctave/array/fCMatrix.cc liboctave/array/fMatrix.cc
diffstat 4 files changed, 4 insertions(+), 52 deletions(-) [+]
line wrap: on
line diff
--- a/liboctave/array/CMatrix.cc	Fri Mar 24 14:42:24 2023 -0700
+++ b/liboctave/array/CMatrix.cc	Fri Mar 24 15:43:28 2023 -0700
@@ -3645,19 +3645,7 @@
 
   retval.clear (m, n);
   for (octave_idx_type i = 0; i < m; i++)
-    retval.xelem (i, 0) = x1(i);
-
-  // The last column is unused so temporarily store delta there
-  Complex *delta = &retval.xelem (0, n-1);
-  for (octave_idx_type i = 0; i < m; i++)
-    delta[i] = (x1(i) == x2(i)) ? 0 : (x2(i) - x1(i)) / (n - 1.0);
-
-  for (octave_idx_type j = 1; j < n-1; j++)
-    for (octave_idx_type i = 0; i < m; i++)
-      retval.xelem (i, j) = x1(i) + static_cast<double> (j)*delta[i];
-
-  for (octave_idx_type i = 0; i < m; i++)
-    retval.xelem (i, n-1) = x2(i);
+    retval.insert (linspace (x1(i), x2(i), n), i, 0);
 
   return retval;
 }
--- a/liboctave/array/dMatrix.cc	Fri Mar 24 14:42:24 2023 -0700
+++ b/liboctave/array/dMatrix.cc	Fri Mar 24 15:43:28 2023 -0700
@@ -3029,19 +3029,7 @@
 
   retval.clear (m, n);
   for (octave_idx_type i = 0; i < m; i++)
-    retval.xelem (i, 0) = x1(i);
-
-  // The last column is unused so temporarily store delta there
-  double *delta = &retval.xelem (0, n-1);
-  for (octave_idx_type i = 0; i < m; i++)
-    delta[i] = (x1(i) == x2(i)) ? 0 : (x2(i) - x1(i)) / (n - 1);
-
-  for (octave_idx_type j = 1; j < n-1; j++)
-    for (octave_idx_type i = 0; i < m; i++)
-      retval.xelem (i, j) = x1(i) + j*delta[i];
-
-  for (octave_idx_type i = 0; i < m; i++)
-    retval.xelem (i, n-1) = x2(i);
+    retval.insert (linspace (x1(i), x2(i), n), i, 0);
 
   return retval;
 }
--- a/liboctave/array/fCMatrix.cc	Fri Mar 24 14:42:24 2023 -0700
+++ b/liboctave/array/fCMatrix.cc	Fri Mar 24 15:43:28 2023 -0700
@@ -3676,19 +3676,7 @@
 
   retval.clear (m, n);
   for (octave_idx_type i = 0; i < m; i++)
-    retval.xelem (i, 0) = x1(i);
-
-  // The last column is unused so temporarily store delta there
-  FloatComplex *delta = &retval.xelem (0, n-1);
-  for (octave_idx_type i = 0; i < m; i++)
-    delta[i] = (x1(i) == x2(i)) ? 0 : (x2(i) - x1(i)) / (n - 1.0f);
-
-  for (octave_idx_type j = 1; j < n-1; j++)
-    for (octave_idx_type i = 0; i < m; i++)
-      retval.xelem (i, j) = x1(i) + static_cast<float> (j)*delta[i];
-
-  for (octave_idx_type i = 0; i < m; i++)
-    retval.xelem (i, n-1) = x2(i);
+    retval.insert (linspace (x1(i), x2(i), n), i, 0);
 
   return retval;
 }
--- a/liboctave/array/fMatrix.cc	Fri Mar 24 14:42:24 2023 -0700
+++ b/liboctave/array/fMatrix.cc	Fri Mar 24 15:43:28 2023 -0700
@@ -3035,19 +3035,7 @@
 
   retval.clear (m, n);
   for (octave_idx_type i = 0; i < m; i++)
-    retval.xelem (i, 0) = x1(i);
-
-  // The last column is unused so temporarily store delta there
-  float *delta = &retval.xelem (0, n-1);
-  for (octave_idx_type i = 0; i < m; i++)
-    delta[i] = (x1(i) == x2(i)) ? 0 : (x2(i) - x1(i)) / (n - 1);
-
-  for (octave_idx_type j = 1; j < n-1; j++)
-    for (octave_idx_type i = 0; i < m; i++)
-      retval.xelem (i, j) = x1(i) + j*delta[i];
-
-  for (octave_idx_type i = 0; i < m; i++)
-    retval.xelem (i, n-1) = x2(i);
+    retval.insert (linspace (x1(i), x2(i), n), i, 0);
 
   return retval;
 }