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)