changeset 27568:e78b6e7f743c

Store constant row vectors for ones(), zeros(), pi(), e() as Ranges for compactness. * data.cc (fill_matrix (const octave_value_list& args, int val, const char *fcn), fill_matrix (const octave_value_list& args, double val, float fval, const char *fcn), fill_matrix (const octave_value_list& args, double val, const char *fcn)): Change 3 overloads of fill_matrix to store 2-D row vector return values as ranges to save memory. Can only store finite values (no Inf, -Inf, NaN, or NA) in Ranges.
author Rik <rik@octave.org>
date Sat, 26 Oct 2019 19:00:54 -0700
parents 51c2e46e9a36
children 29ccef7e5295
files libinterp/corefcn/data.cc
diffstat 1 files changed, 10 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/corefcn/data.cc	Sat Oct 26 05:56:52 2019 -0700
+++ b/libinterp/corefcn/data.cc	Sat Oct 26 19:00:54 2019 -0700
@@ -4016,8 +4016,8 @@
 
     case oct_data_conv::dt_double:
       {
-        if (val == 1 && dims.ndims () == 2 && dims(0) == 1)
-          retval = Range (1.0, 0.0, dims(1));  // packed form
+        if (dims.ndims () == 2 && dims(0) == 1)
+          retval = Range (static_cast<double> (val), 0.0, dims(1));
         else
           retval = NDArray (dims, val);
       }
@@ -4088,7 +4088,10 @@
       break;
 
     case oct_data_conv::dt_double:
-      retval = NDArray (dims, val);
+      if (dims.ndims () == 2 && dims(0) == 1 && octave::math::isfinite (val))
+        retval = Range (val, 0.0, dims(1));  // Packed form
+      else
+        retval = NDArray (dims, val);
       break;
 
     default:
@@ -4151,7 +4154,10 @@
       break;
 
     case oct_data_conv::dt_double:
-      retval = NDArray (dims, val);
+      if (dims.ndims () == 2 && dims(0) == 1 && octave::math::isfinite (val))
+        retval = Range (val, 0.0, dims(1));  // Packed form
+      else
+        retval = NDArray (dims, val);
       break;
 
     default: