changeset 33148:beae4d70e218 stable

median.m: Fix vectors with Infs incorrectly returning NaN (bug #65405) * scripts/statistics/median.m: Add check for even vectors with Inf as median values where substraction returns NaN instead of Inf. Add BISTs. * scripts/statistics/mad.m: Add BISTs affected by change to median.
author Nicholas R. Jankowski <jankowski.nicholas@gmail.com>
date Tue, 05 Mar 2024 17:54:00 -0500
parents d043168d4cf2
children 963b9183ea1d 05f32a32ec3f
files scripts/statistics/mad.m scripts/statistics/median.m
diffstat 2 files changed, 47 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/statistics/mad.m	Mon Mar 04 12:35:12 2024 -0800
+++ b/scripts/statistics/mad.m	Tue Mar 05 17:54:00 2024 -0500
@@ -184,6 +184,32 @@
 %!assert (mad (ones (2, 0, 1, 0)), ones (1, 0, 1, 0))
 
 ## Test Inf handling
+%!assert (mad ([3, 4, Inf]), Inf)
+%!assert (mad ([Inf, 3, 4]), Inf)
+%!assert (mad ([3, 4, Inf], 0), Inf)
+%!assert (mad ([3, 4, Inf], 0, 1), [0, 0, NaN])
+%!assert (mad ([3, 4, Inf], 0, 2), Inf)
+%!assert (mad ([3, 4, Inf], 0, 3), [0, 0, NaN])
+%!assert (mad ([3, 4, Inf]', 0), Inf)
+%!assert (mad ([3, 4, Inf]', 0, 1), Inf)
+%!assert (mad ([3, 4, Inf]', 0, 2), [0; 0; NaN])
+%!assert (mad ([3, 4, Inf]', 0, 3), [0; 0; NaN])
+
+%!assert (mad ([Inf, 3, 4], 1), 1)
+%!assert (mad ([3, 4, Inf], 1), 1)
+%!assert (mad ([3, 4, Inf], 1, 1), [0, 0, NaN])
+%!assert (mad ([3, 4, Inf], 1, 2), 1)
+%!assert (mad ([3, 4, Inf], 1, 3), [0, 0, NaN])
+%!assert (mad ([3, 4, Inf]', 1), 1)
+%!assert (mad ([3, 4, Inf]', 1, 1), 1)
+%!assert (mad ([3, 4, Inf]', 1, 2), [0; 0; NaN])
+%!assert (mad ([3, 4, Inf]', 1, 3), [0; 0; NaN])
+
+%!assert (mad ([3, Inf, Inf], 1), Inf)
+%!assert (mad ([3, 4, 5, Inf], 1), 1)
+%!assert (mad ([3, 4, Inf, Inf], 1), Inf)
+%!assert (mad ([3, Inf, Inf, Inf], 1), Inf)
+
 %!assert <*65405> (mad ([-Inf, Inf]), NaN)
 %!assert <*65405> (mad ([-Inf, Inf], 0), NaN)
 %!assert <*65405> (mad ([-Inf, Inf], 1), NaN)
--- a/scripts/statistics/median.m	Mon Mar 04 12:35:12 2024 -0800
+++ b/scripts/statistics/median.m	Tue Mar 05 17:54:00 2024 -0500
@@ -382,7 +382,10 @@
         m = x(k);
         if (! mod (n, 2))
           ## Even
-          if (any (isa (x, "integer")))
+          if (any (isinf ([x(k), x(k+1)])))
+            ## If either center value is Inf, replace m by +/-Inf or NaN.
+            m = x(k) + x(k+1);
+          elseif (any (isa (x, "integer")))
             ## avoid int overflow issues
             m2 = x(k + 1);
             if (sign (m) != sign (m2))
@@ -625,8 +628,24 @@
 %!assert (median ([Inf, 3, 4]), 4)
 %!assert (median ([Inf, 3, Inf]), Inf)
 
+%!assert (median ([1, 2, Inf]), 2)
+%!assert (median ([1, 2, Inf, Inf]), Inf)
+%!assert (median ([1, -Inf, Inf, Inf]), Inf)
+%!assert (median ([-Inf, -Inf, Inf, Inf]), NaN)
+%!assert (median([-Inf, Inf, Inf, Inf]), Inf)
+%!assert (median([-Inf, -Inf, -Inf, Inf]), -Inf)
+%!assert (median([-Inf, -Inf, -Inf, 2]), -Inf)
+%!assert (median([-Inf, -Inf, 1, 2]), -Inf)
+
+%!assert (median ([Inf, Inf, NaN]), NaN)
+%!assert (median ([-Inf, Inf, NaN]), NaN)
+%!assert (median ([Inf, Inf, NaN], "omitnan"), Inf)
+%!assert (median ([-Inf, Inf, NaN], "omitnan"), NaN)
+%!assert (median ([-Inf, Inf, 3, NaN], "omitnan"), 3)
+%!assert (median ([-Inf, Inf, 3, -Inf, NaN], "omitnan"), -Inf)
+
 %!assert (median ([]), NaN)
-%!assert (median (ones (1, 0)), NaN) 
+%!assert (median (ones (1, 0)), NaN)
 %!assert (median (ones (0, 1)), NaN)
 %!assert (median ([], 1), NaN (1, 0))
 %!assert (median ([], 2), NaN (0, 1))