# HG changeset patch # User Lachlan Andrew # Date 1452761992 -39600 # Node ID f780d057a3ec550a8a0f4ff808a058359b36bfaf # Parent dfce76507f4beb7ca6009dc55adf7029cfb68f10 Let max/min return a second (index) value for sparse logicals (bug #41512). * max.cc (do_minmax_red_op): For sparse bool arrays, cast to sparse double arrays before perfoming min/max. diff -r dfce76507f4b -r f780d057a3ec libinterp/corefcn/max.cc --- 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 (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 (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 (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 (arg, nargout, dim, ismin); - retval(0) = retval(0).bool_array_value (); + retval(0) = retval(0).sparse_bool_matrix_value (); } return retval;