changeset 33130:ca773dcbb420 stable

median.m: Correct handling of all-NaN vectors (bug #65405) * scripts/statistics/median.m: Add shortcut codepath for all-NaN inputs regardless of size. Add BISTs for all-NaN vectors and arrays with 'omitnan' option. * scripts/statistics/mad.m: Add BISTs for all Inf inputs with option to call median.
author Nicholas R. Jankowski <jankowski.nicholas@gmail.com>
date Sat, 02 Mar 2024 23:28:56 -0500
parents 9c08824262af
children 41ac5e288d5a 2c8ade2c7491
files scripts/statistics/mad.m scripts/statistics/median.m
diffstat 2 files changed, 48 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/statistics/mad.m	Sat Mar 02 13:54:06 2024 -0800
+++ b/scripts/statistics/mad.m	Sat Mar 02 23:28:56 2024 -0500
@@ -183,6 +183,29 @@
 %!assert (mad (ones (0,2,1,0)), ones (1,2,1,0))
 %!assert (mad (ones (2,0,1,0)), ones (1,0,1,0))
 
+## Test inf handling
+%!assert <*65405> (mad ([-Inf Inf]), NaN)
+%!assert <*65405> (mad ([-Inf Inf], 0), NaN)
+%!assert <*65405> (mad ([-Inf Inf], 1), NaN)
+%!assert <*65405> (mad ([-Inf Inf]', 0), NaN)
+%!assert <*65405> (mad ([-Inf Inf]', 1), NaN)
+%!assert <*65405> (mad ([-Inf Inf]', 0, 1), NaN)
+%!assert <*65405> (mad ([-Inf Inf]', 0, 2), [NaN; NaN])
+%!assert <*65405> (mad ([-Inf Inf]', 0, 3), [NaN; NaN])
+%!assert <*65405> (mad ([-Inf Inf]', 1, 1), NaN)
+%!assert <*65405> (mad ([-Inf Inf]', 1, 2), [NaN; NaN])
+%!assert <*65405> (mad ([-Inf Inf]', 1, 3), [NaN; NaN])
+%!assert <*65405> (mad (Inf(2), 0), [NaN, NaN])
+%!assert <*65405> (mad (Inf(2), 1), [NaN, NaN])
+%!assert <*65405> (mad (Inf(2), 0, 1), [NaN, NaN])
+%!assert <*65405> (mad (Inf(2), 0, 2), [NaN; NaN])
+%!assert <*65405> (mad (Inf(2), 0, 3), NaN(2))
+%!assert <*65405> (mad (Inf(2), 1, 1), [NaN, NaN])
+%!assert <*65405> (mad (Inf(2), 1, 2), [NaN; NaN])
+%!assert <*65405> (mad (Inf(2), 1, 3), NaN(2))
+
+
+
 ## Test input case insensitivity
 %!assert (mad ([1 2 3], 0, "aLL"), 2/3, eps)
 %!assert (mad ([1 2 3], 1, "aLL"), 1)
--- a/scripts/statistics/median.m	Sat Mar 02 13:54:06 2024 -0800
+++ b/scripts/statistics/median.m	Sat Mar 02 23:28:56 2024 -0500
@@ -267,6 +267,12 @@
     return;
   endif
 
+  if (all (isnan (x)(:)))
+    ## all NaN input, output single or double NaNs in pre-determined size
+    m = NaN(sz_out, outtype);
+    return
+  endif
+
   if (szx(dim) == 1)
     ## Operation along singleton dimension - nothing to do
     if (! strcmp (class (x), outtype))
@@ -307,6 +313,7 @@
 
   ## Find column locations of NaNs
   nanfree = ! any (isnan (x), dim);
+
   if (omitnan && nanfree(:))
     ## Don't use omitnan path if no NaNs are present.  Prevents any data types
     ## without a defined NaN from following slower omitnan codepath.
@@ -570,6 +577,24 @@
 %!assert (median ([NaN 2 ; NaN 4], "omitnan"), [NaN 3])
 %!assert (median (ones (1, 0, 3)), NaN (1, 1, 3))
 
+## Test all NaN vectors and arrays - see bug #65405
+%!assert <*65405> (median ([NaN NaN], 1, "omitnan"), [NaN NaN])
+%!assert <*65405> (median ([NaN NaN], 2, "omitnan"), NaN)
+%!assert <*65405> (median ([NaN NaN]', 1, "omitnan"), NaN)
+%!assert <*65405> (median ([NaN NaN]', 2, "omitnan"), [NaN; NaN])
+%!assert <*65405> (median ([NaN NaN], "omitnan"), NaN)
+%!assert <*65405> (median ([NaN NaN]', "omitnan"), NaN)
+%!assert <*65405> (median (NaN(1,9), 1, "omitnan"), NaN(1,9))
+%!assert <*65405> (median (NaN(1,9), 2, "omitnan"), NaN)
+%!assert <*65405> (median (NaN(1,9), 3, "omitnan"), NaN(1,9))
+%!assert <*65405> (median (NaN(9,1), 1, "omitnan"), NaN)
+%!assert <*65405> (median (NaN(9,1), 2, "omitnan"), NaN(9,1))
+%!assert <*65405> (median (NaN(9,1), 3, "omitnan"), NaN(9,1))
+%!assert <*65405> (median (NaN(9,2), 1, "omitnan"), NaN(1,2))
+%!assert <*65405> (median (NaN(9,2), 2, "omitnan"), NaN(9,1))
+%!assert <*65405> (median (NaN(9,2), "omitnan"), NaN(1,2))
+
+## Test single inputs
 %!assert (median (NaN("single")), NaN("single"))
 %!assert (median (NaN("single"), "omitnan"), NaN("single"))
 %!assert (median (NaN("single"), "double"), NaN("double"))