# HG changeset patch # User Rik # Date 1455946023 28800 # Node ID 7fbecef105caaa701a09f83b53240a25a2184632 # Parent c53bfd6d8e08c95154de691469b5b35caed13b00 Allow statistics functions to work over non-existent dimension (bug #33523). * var.m, center.m, kurtosis.m, mean.m, meansq.m, median.m, moment.m, skewness.m, std.m: Remove check for input dimension being within the range of ndims (x). Add BIST tests for new behavior and update input validation tests. diff -r c53bfd6d8e08 -r 7fbecef105ca scripts/statistics/base/center.m --- a/scripts/statistics/base/center.m Fri Feb 19 09:40:59 2016 -0800 +++ b/scripts/statistics/base/center.m Fri Feb 19 21:27:03 2016 -0800 @@ -59,13 +59,12 @@ ## Find the first non-singleton dimension. (dim = find (sz > 1, 1)) || (dim = 1); else - if (!(isscalar (dim) && dim == fix (dim)) - || !(1 <= dim && dim <= nd)) + if (! (isscalar (dim) && dim == fix (dim) && dim > 0)) error ("center: DIM must be an integer and a valid dimension"); endif endif - n = sz(dim); + n = size (x, dim); if (n == 0) retval = x; @@ -84,12 +83,12 @@ %!assert (center (ones (3,2,0,2, "single")), zeros (3,2,0,2, "single")) %!assert (center (magic (3)), [3,-4,1;-2,0,2;-1,4,-3]) %!assert (center ([1 2 3; 6 5 4], 2), [-1 0 1; 1 0 -1]) +%!assert (center (1, 3), 0) ## Test input validation %!error center () %!error center (1, 2, 3) -%!error center (1, ones (2,2)) -%!error center (1, 1.5) -%!error center (1, 0) -%!error center (1, 3) +%!error center (1, ones (2,2)) +%!error center (1, 1.5) +%!error center (1, 0) diff -r c53bfd6d8e08 -r 7fbecef105ca scripts/statistics/base/kurtosis.m --- a/scripts/statistics/base/kurtosis.m Fri Feb 19 09:40:59 2016 -0800 +++ b/scripts/statistics/base/kurtosis.m Fri Feb 19 21:27:03 2016 -0800 @@ -105,12 +105,12 @@ ## Find the first non-singleton dimension. (dim = find (sz > 1, 1)) || (dim = 1); else - if (! (isscalar (dim) && dim == fix (dim)) || ! (1 <= dim && dim <= nd)) + if (! (isscalar (dim) && dim == fix (dim) && dim > 0)) error ("kurtosis: DIM must be an integer and a valid dimension"); endif endif - n = sz(dim); + n = size (x, dim); sz(dim) = 1; x = center (x, dim); # center also promotes integer, logical to double @@ -140,6 +140,7 @@ %!assert (kurtosis ([-3, 0, 1]) == kurtosis ([-1, 0, 3])) %!assert (kurtosis (ones (3, 5)), NaN (1, 5)) +%!assert (kurtosis (1, [], 3), NaN) %!assert (kurtosis ([1:5 10; 1:5 10], 0, 2), 5.4377317925288901 * [1; 1], 8 * eps) %!assert (kurtosis ([1:5 10; 1:5 10], 1, 2), 2.9786509002956195 * [1; 1], 8 * eps) @@ -165,5 +166,4 @@ %!error kurtosis (1, [], ones (2,2)) %!error kurtosis (1, [], 1.5) %!error kurtosis (1, [], 0) -%!error kurtosis (1, [], 3) diff -r c53bfd6d8e08 -r 7fbecef105ca scripts/statistics/base/mean.m --- a/scripts/statistics/base/mean.m Fri Feb 19 09:40:59 2016 -0800 +++ b/scripts/statistics/base/mean.m Fri Feb 19 21:27:03 2016 -0800 @@ -105,13 +105,12 @@ ## Find the first non-singleton dimension. (dim = find (sz > 1, 1)) || (dim = 1); else - if (!(isscalar (dim) && dim == fix (dim)) - || !(1 <= dim && dim <= nd)) + if (! (isscalar (dim) && dim == fix (dim) && dim > 0)) error ("mean: DIM must be an integer and a valid dimension"); endif endif - n = sz(dim); + n = size (x, dim); if (strcmp (opt, "a")) y = sum (x, dim) / n; @@ -147,15 +146,16 @@ %!assert (mean ([4 4 2], "h"), 3) %!assert (mean (logical ([1 0 1 1])), 0.75) %!assert (mean (single ([1 0 1 1])), single (0.75)) +%!assert (mean ([1 2], 3), [1 2]) ## Test input validation %!error mean () %!error mean (1, 2, 3, 4) -%!error mean ({1:5}) -%!error mean (1, 2, 3) -%!error mean (1, ones (2,2)) -%!error mean (1, 1.5) -%!error mean (1, 0) -%!error mean (1, 3) -%!error mean (1, "b") +%!error mean ({1:5}) +%!error mean (1, 2, 3) +%!error mean (1, ones (2,2)) +%!error mean (1, 1.5) +%!error mean (1, 0) +%!error mean ([1 -1], "g") +%!error