changeset 21265:f780d057a3ec

Let max/min return a second (index) value for sparse logicals (bug #41512). * max.cc (do_minmax_red_op<boolNDArray>): For sparse bool arrays, cast to sparse double arrays before perfoming min/max.
author Lachlan Andrew <lachlanbis@gmail.com>
date Thu, 14 Jan 2016 19:59:52 +1100
parents dfce76507f4b
children e69eaee28737
files libinterp/corefcn/max.cc
diffstat 1 files changed, 23 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/corefcn/max.cc	Mon Feb 15 14:03:23 2016 -0800
+++ b/libinterp/corefcn/max.cc	Thu Jan 14 19:59:52 2016 +1100
@@ -107,7 +107,7 @@
   return retval;
 }
 
-// Specialization for bool arrays.
+// Specialization for bool arrays (dense or sparse).
 template <>
 octave_value_list
 do_minmax_red_op<boolNDArray> (const octave_value& arg,
@@ -115,24 +115,35 @@
 {
   octave_value_list retval;
 
-  if (nargout <= 1)
+  if (! arg.is_sparse_type ())
     {
-      // This case can be handled using any/all.
-      boolNDArray array = arg.bool_array_value ();
+      if (nargout <= 1)
+        {
+          // This case can be handled using any/all.
+          boolNDArray array = arg.bool_array_value ();
 
-      if (array.is_empty ())
-        retval(0) = array;
-      else if (ismin)
-        retval(0) = array.all (dim);
+          if (array.is_empty ())
+            retval(0) = array;
+          else if (ismin)
+            retval(0) = array.all (dim);
+          else
+            retval(0) = array.any (dim);
+        }
       else
-        retval(0) = array.any (dim);
+        {
+          // any/all don't have indexed versions, so do it via a conversion.
+          retval = do_minmax_red_op<int8NDArray> (arg, nargout, dim, ismin);
+
+          retval(0) = retval(0).bool_array_value ();
+        }
     }
   else
     {
-      // any/all don't have indexed versions, so do it via a conversion.
-      retval = do_minmax_red_op<int8NDArray> (arg, nargout, dim, ismin);
+      // Sparse: Don't use any/all trick, as full matrix could exceed memory. 
+      // Instead, convert to double.
+      retval = do_minmax_red_op<SparseMatrix> (arg, nargout, dim, ismin);
 
-      retval(0) = retval(0).bool_array_value ();
+      retval(0) = retval(0).sparse_bool_matrix_value ();
     }
 
   return retval;