gusucode.com > symbolic工具箱matlab源码程序 > symbolic/@sym/nchoosek.m

    function c = nchoosek(n,k)
%NCHOOSEK Binomial coefficient or all combinations.
%    NCHOOSEK(N,K) where N and K are scalars returns N!/K!(N-K)!.
%
%    NCHOOSEK(V,K) returns a matrix containing all possible combinations 
%    of the elements of vector V taken K at a time. K must be a
%    non-negative integer.
%    The result has K columns and NCHOOSEK(N, K) rows, where N is length(V).

%   Copyright 2011-2015 The MathWorks, Inc.
    

if ~isa(n, 'sym') && ~isscalar(n)
    c = nchoosek(n, double(k));
    return;
end    

N = formula(sym(n));
K = formula(sym(k));

if isscalar(N)
    args = privResolveArgs(n, k);
    if ~isscalar(K) 
        error(message('symbolic:sym:nchoosek:SecondArgumentMustBeScalar'));
    end
    cSym = binomial(N, K);
else
    args = privResolveArgs(n);
    if ~isPositiveInteger(K) && ~isequal(K, sym(0))
        error(message('symbolic:sym:nchoosek:SecondArgumentMustBeNonNegInt'));
    end    
    if ~isvector(N) 
        error(message('symbolic:sym:nchoosek:FirstArgumentMustBeScalarOrVector'));
    end    
    cSym = subwords(N, K);
end
 c = privResolveOutput(cSym, args{1});


function cSym = binomial(N, K)    
if N == sym(inf) 
    % for compatibility with doubles
    if K == sym(0) 
        cSym = sym(1);
    elseif K == sym(1)
        cSym = sym(inf);
    else
        cSym = sym(NaN);
    end    
elseif ~isfinite(N) || ~isfinite(K)
    cSym = sym(NaN);
else
    cSym = mupadmex('binomial', N.s, K.s);
end    

function cSym = subwords(N, K)
N = feval(symengine, 'symobj::tolist', N);
cSym = feval(symengine, 'combinat::subwords', N, K);
cSym = feval(symengine, 'matrix', numel(cSym), K, cSym);