changeset 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 8f61866f0f6d
files scripts/specfun/nchoosek.m
diffstat 1 files changed, 31 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- 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 <Invalid call> nchoosek ()