Mercurial > octave
comparison scripts/specfun/nchoosek.m @ 30206:aaee7b170cb1
nchoosek.m: Allow struct inputs (bug #61119)
* nchoosek.m: Change input validation to avoid numeric checks if input V is
scalar but not a number. Add BIST tests for exceptional values of scalar
structs and struct arrays.
author | Rik <rik@octave.org> |
---|---|
date | Thu, 23 Sep 2021 12:19:54 -0700 |
parents | 23a907b2dbd5 |
children | 54774a713d7c |
comparison
equal
deleted
inserted
replaced
30205:23a907b2dbd5 | 30206:aaee7b170cb1 |
---|---|
100 error ("nchoosek: first argument must be a scalar or a vector"); | 100 error ("nchoosek: first argument must be a scalar or a vector"); |
101 endif | 101 endif |
102 if (! (isreal (k) && isscalar (k) && k >= 0 && k == fix (k))) | 102 if (! (isreal (k) && isscalar (k) && k >= 0 && k == fix (k))) |
103 error ("nchoosek: K must be an integer >= 0"); | 103 error ("nchoosek: K must be an integer >= 0"); |
104 endif | 104 endif |
105 if (isscalar (v) && (iscomplex (v) || v < k || v < 0 || v != fix (v))) | 105 if (isscalar (v)) |
106 error ("nchoosek: N must be a non-negative integer >= K"); | 106 if (isnumeric (v) && (iscomplex (v) || v < k || v < 0 || v != fix (v))) |
107 error ("nchoosek: N must be a non-negative integer >= K"); | |
108 endif | |
107 endif | 109 endif |
108 | 110 |
109 n = numel (v); | 111 n = numel (v); |
110 | 112 |
111 if (n == 1 && isnumeric (v)) | 113 if (n == 1 && isnumeric (v)) |
203 %! assert (isa (x, "uint8")); | 205 %! assert (isa (x, "uint8")); |
204 | 206 |
205 %!test | 207 %!test |
206 %! x = nchoosek ({1, 2}, 0); | 208 %! x = nchoosek ({1, 2}, 0); |
207 %! assert (size (x), [1, 0]); | 209 %! assert (size (x), [1, 0]); |
208 %! assert (isa (x, "cell")); | 210 %! assert (iscell (x)); |
209 %! x = nchoosek ({1, 2}, 3); | 211 %! x = nchoosek ({1, 2}, 3); |
210 %! assert (size (x), [0, 3]); | 212 %! assert (size (x), [0, 3]); |
211 %! assert (isa (x, "cell")); | 213 %! assert (iscell (x)); |
214 | |
215 %!test | |
216 %! s.a = [1 2 3]; | |
217 %! s.b = [4 5 6]; | |
218 %! x = nchoosek (s, 0); | |
219 %! assert (size (x), [1, 0]); | |
220 %! assert (isstruct (x)); | |
221 %! assert (fieldnames (x), {"a"; "b"}); | |
222 %! x = nchoosek (s, 3); | |
223 %! assert (size (x), [0, 3]); | |
224 %! assert (isstruct (x)); | |
225 %! assert (fieldnames (x), {"a"; "b"}); | |
226 | |
227 %!test | |
228 %! s.a = [1 2 3]; | |
229 %! s.b = [4 5 6]; | |
230 %! s(2).a = 1; # make s a struct array rather than scalar struct | |
231 %! x = nchoosek (s, 0); | |
232 %! assert (size (x), [1, 0]); | |
233 %! assert (isstruct (x)); | |
234 %! assert (fieldnames (x), {"a"; "b"}); | |
235 %! x = nchoosek (s, 3); | |
236 %! assert (size (x), [0, 3]); | |
237 %! assert (isstruct (x)); | |
238 %! assert (fieldnames (x), {"a"; "b"}); | |
212 | 239 |
213 ## Test input validation | 240 ## Test input validation |
214 %!error <Invalid call> nchoosek () | 241 %!error <Invalid call> nchoosek () |
215 %!error <Invalid call> nchoosek (1) | 242 %!error <Invalid call> nchoosek (1) |
216 %!error <first argument must be a scalar or a vector> nchoosek (ones (3, 3), 1) | 243 %!error <first argument must be a scalar or a vector> nchoosek (ones (3, 3), 1) |