# HG changeset patch # User Rik # Date 1632424794 25200 # Node ID aaee7b170cb1449131efdea9f4ec18c61c63e85d # Parent 23a907b2dbd513d04587518a90f25342e282ee82 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. diff -r 23a907b2dbd5 -r aaee7b170cb1 scripts/specfun/nchoosek.m --- a/scripts/specfun/nchoosek.m Thu Sep 23 10:00:12 2021 -0700 +++ b/scripts/specfun/nchoosek.m Thu Sep 23 12:19:54 2021 -0700 @@ -102,8 +102,10 @@ if (! (isreal (k) && isscalar (k) && k >= 0 && k == fix (k))) error ("nchoosek: K must be an integer >= 0"); endif - if (isscalar (v) && (iscomplex (v) || v < k || v < 0 || v != fix (v))) - error ("nchoosek: N must be a non-negative integer >= K"); + if (isscalar (v)) + if (isnumeric (v) && (iscomplex (v) || v < k || v < 0 || v != fix (v))) + error ("nchoosek: N must be a non-negative integer >= K"); + endif endif n = numel (v); @@ -205,10 +207,35 @@ %!test %! x = nchoosek ({1, 2}, 0); %! assert (size (x), [1, 0]); -%! assert (isa (x, "cell")); +%! assert (iscell (x)); %! x = nchoosek ({1, 2}, 3); %! assert (size (x), [0, 3]); -%! assert (isa (x, "cell")); +%! assert (iscell (x)); + +%!test +%! s.a = [1 2 3]; +%! s.b = [4 5 6]; +%! x = nchoosek (s, 0); +%! assert (size (x), [1, 0]); +%! assert (isstruct (x)); +%! assert (fieldnames (x), {"a"; "b"}); +%! x = nchoosek (s, 3); +%! assert (size (x), [0, 3]); +%! assert (isstruct (x)); +%! assert (fieldnames (x), {"a"; "b"}); + +%!test +%! s.a = [1 2 3]; +%! s.b = [4 5 6]; +%! s(2).a = 1; # make s a struct array rather than scalar struct +%! x = nchoosek (s, 0); +%! assert (size (x), [1, 0]); +%! assert (isstruct (x)); +%! assert (fieldnames (x), {"a"; "b"}); +%! x = nchoosek (s, 3); +%! assert (size (x), [0, 3]); +%! assert (isstruct (x)); +%! assert (fieldnames (x), {"a"; "b"}); ## Test input validation %!error nchoosek ()