diff --git a/scripts/specfun/nchoosek.m b/scripts/specfun/nchoosek.m --- a/scripts/specfun/nchoosek.m +++ b/scripts/specfun/nchoosek.m @@ -94,18 +94,19 @@ function C = nchoosek (v, k) if (nargin != 2 || ! (isreal (k) && isscalar (k)) - || ! ((isnumeric (v) || ischar (v)) && isvector (v))) + || ! isvector (v)) print_usage (); endif if (k < 0 || k != fix (k)) error ("nchoosek: K must be an integer >= 0"); - elseif (isscalar (v) && (iscomplex (v) || v < k || v < 0 || v != fix (v))) + elseif (isnumeric (v) && isscalar (v) + && (iscomplex (v) || v < k || v < 0 || v != fix (v))) error ("nchoosek: N must be a non-negative integer >= K"); endif n = length (v); - if (n == 1) + if (isnumeric (v) && n == 1) ## Improve precision at next step. k = min (k, v-k); C = round (prod ((v-k+1:v)./(1:k))); @@ -113,25 +114,13 @@ function C = nchoosek (v, k) warning ("nchoosek: possible loss of precision"); endif elseif (k == 0) - if (is_sq_string (v)) - C = resize ('', 1, 0); - elseif (is_dq_string (v)) - C = resize ("", 1, 0); - else - C = zeros (1, 0, class (v)); - endif + C = v(zeros(1, 0)); elseif (k == 1) C = v(:); elseif (k == n) C = v(:).'; elseif (k > n) - if (is_sq_string (v)) - C = resize ('', 0, k); - elseif (is_dq_string (v)) - C = resize ("", 0, k); - else - C = zeros (0, k, class (v)); - endif + C = v(zeros (0, k)); elseif (k == 2) ## Can do it without transpose. x = repelems (v(1:n-1), [1:n-1; n-1:-1:1]).'; @@ -178,24 +167,60 @@ endfunction %!assert (nchoosek ('a':'b', 2), 'ab') %!assert (nchoosek ("a":"b", 2), "ab") -%!test +%!test <61119> %! x = nchoosek ('a':'b', 3); %! assert (size (x), [0, 3]); %! assert (is_sq_string (x)); + +%!test <61119> %! x = nchoosek ('a':'b', 0); %! assert (size (x), [1, 0]); %! assert (is_sq_string (x)); -%! + +%!test <61119> +%! x = nchoosek ('a', 0); +%! assert (size (x), [1, 0]); +%! assert (is_sq_string (x)); + +%!assert <61119> (nchoosek ('a', 1), 'a') + +%!test <61119> %! x = nchoosek ("a":"b", 3); %! assert (size (x), [0, 3]); %! assert (is_dq_string (x)); + +%!test <61119> %! x = nchoosek ("a":"b", 0); %! assert (size (x), [1, 0]); %! assert (is_dq_string (x)); -%! + +%!test <61119> +%! x = nchoosek ("a", 0); +%! assert (size (x), [1, 0]); +%! assert (is_dq_string (x)); + +%!assert <61119> (nchoosek ("a", 1), "a") + +%!test <61119> %! x = nchoosek (uint8(1):uint8(2), 3); %! assert (size (x), [0, 3]); %! assert (class (x), "uint8"); + +%!test <61119> %! x = nchoosek (uint8(1):uint8(2), 0); %! assert (size (x), [1, 0]); %! assert (class (x), "uint8"); + +%!assert <61119> (nchoosek (uint8(13), 1), 13) + +%!test <61119> +%! x = nchoosek ({1, 2}, 3); +%! assert (size (x), [0, 3]); +%! assert (iscell (x)); + +%!test <61119> +%! x = nchoosek ({1, 2}, 0); +%! assert (size (x), [1, 0]); +%! assert (iscell (x)); + +%!assert <61119> (nchoosek ({13}, 1), {13})