# HG changeset patch # User Jaroslav Hajek # Date 1260997898 -3600 # Node ID b22a2f4b34aadfa6fe0f40e9e44e668378d237e7 # Parent a5a05b2ebb9df9d3999ab8dd73363f894570db74 support min/max with logical arrays diff -r a5a05b2ebb9d -r b22a2f4b34aa src/ChangeLog --- a/src/ChangeLog Wed Dec 16 07:38:52 2009 +0100 +++ b/src/ChangeLog Wed Dec 16 22:11:38 2009 +0100 @@ -1,3 +1,9 @@ +2009-12-16 Jaroslav Hajek + + * DLD-FUNCTIONS/max.cc (do_minmax_red_op): New + specialization. + (do_minmax_body): Handle btyp_bool. + 2009-12-16 Jaroslav Hajek * symtab.cc (symbol_table::cleanup): Call clear_variables rather than diff -r a5a05b2ebb9d -r b22a2f4b34aa src/DLD-FUNCTIONS/max.cc --- a/src/DLD-FUNCTIONS/max.cc Wed Dec 16 07:38:52 2009 +0100 +++ b/src/DLD-FUNCTIONS/max.cc Wed Dec 16 22:11:38 2009 +0100 @@ -75,6 +75,37 @@ return retval; } +// Specialization for bool arrays. +template <> +octave_value_list +do_minmax_red_op (const octave_value& arg, + int nargout, int dim, bool ismin) +{ + octave_value_list retval; + + 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); + else + retval(0) = array.any (dim); + } + else + { + // any/all don't have indexed versions, so do it via a conversion. + retval = do_minmax_red_op (arg, nargout, dim, ismin); + if (! error_state) + retval(0) = retval(0).bool_array_value (); + } + + return retval; +} + template static octave_value do_minmax_bin_op (const octave_value& argx, const octave_value& argy, @@ -210,6 +241,9 @@ MAKE_INT_BRANCH (uint32); MAKE_INT_BRANCH (uint64); #undef MAKE_INT_BRANCH + case btyp_bool: + retval = do_minmax_red_op (arg, nargout, dim, ismin); + break; default: gripe_wrong_type_arg (func, arg); }