Mercurial > octave
comparison scripts/statistics/base/var.m @ 21309:7fbecef105ca
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.
author | Rik <rik@octave.org> |
---|---|
date | Fri, 19 Feb 2016 21:27:03 -0800 |
parents | 516bb87ea72e |
children | bac0d6f07a3e |
comparison
equal
deleted
inserted
replaced
21308:c53bfd6d8e08 | 21309:7fbecef105ca |
---|---|
73 error ("var: X must be a numeric vector or matrix"); | 73 error ("var: X must be a numeric vector or matrix"); |
74 endif | 74 endif |
75 | 75 |
76 if (isempty (opt)) | 76 if (isempty (opt)) |
77 opt = 0; | 77 opt = 0; |
78 endif | 78 elseif (opt != 0 && opt != 1) |
79 if (opt != 0 && opt != 1) | |
80 error ("var: normalization OPT must be 0 or 1"); | 79 error ("var: normalization OPT must be 0 or 1"); |
81 endif | 80 endif |
82 | 81 |
83 nd = ndims (x); | 82 nd = ndims (x); |
84 sz = size (x); | 83 sz = size (x); |
85 if (nargin < 3) | 84 if (nargin < 3) |
86 ## Find the first non-singleton dimension. | 85 ## Find the first non-singleton dimension. |
87 (dim = find (sz > 1, 1)) || (dim = 1); | 86 (dim = find (sz > 1, 1)) || (dim = 1); |
88 else | 87 else |
89 if (!(isscalar (dim) && dim == fix (dim)) | 88 if (! (isscalar (dim) && dim == fix (dim) && dim > 0)) |
90 || !(1 <= dim && dim <= nd)) | |
91 error ("var: DIM must be an integer and a valid dimension"); | 89 error ("var: DIM must be an integer and a valid dimension"); |
92 endif | 90 endif |
93 endif | 91 endif |
94 | 92 |
95 n = sz(dim); | 93 n = size (x, dim); |
96 if (n == 1) | 94 if (n == 1) |
97 if (isa (x, "single")) | 95 if (isa (x, "single")) |
98 retval = zeros (sz, "single"); | 96 retval = zeros (sz, "single"); |
99 else | 97 else |
100 retval = zeros (sz); | 98 retval = zeros (sz); |
111 %!assert (var (13), 0) | 109 %!assert (var (13), 0) |
112 %!assert (var (single (13)), single (0)) | 110 %!assert (var (single (13)), single (0)) |
113 %!assert (var ([1,2,3]), 1) | 111 %!assert (var ([1,2,3]), 1) |
114 %!assert (var ([1,2,3], 1), 2/3, eps) | 112 %!assert (var ([1,2,3], 1), 2/3, eps) |
115 %!assert (var ([1,2,3], [], 1), [0,0,0]) | 113 %!assert (var ([1,2,3], [], 1), [0,0,0]) |
114 %!assert (var ([1,2,3], [], 3), [0,0,0]) | |
116 | 115 |
117 ## Test input validation | 116 ## Test input validation |
118 %!error var () | 117 %!error var () |
119 %!error var (1,2,3,4) | 118 %!error var (1,2,3,4) |
120 %!error var (['A'; 'B']) | 119 %!error <X must be a numeric> var (['A'; 'B']) |
121 %!error var (1, -1) | 120 %!error <OPT must be 0 or 1> var (1, -1) |
122 %!error var ([], 1) | 121 %!error <FLAG must be 0 or 1> skewness (1, 2) |
122 %!error <FLAG must be 0 or 1> skewness (1, [1 0]) | |
123 %!error <DIM must be an integer> var (1, [], ones (2,2)) | |
124 %!error <DIM must be an integer> var (1, [], 1.5) | |
125 %!error <DIM must be .* a valid dimension> var (1, [], 0) | |
126 %!error <X must not be empty> var ([], 1) | |
123 | 127 |