Mercurial > octave
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))