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