MATLAB:向量的nchoosek

时间:2015-01-12 22:07:47

标签: performance matlab combinations

x = [3:10]。我想为每个nchoosek(x(i),3)找到i。是否有一个函数(或更好的方法)在不使用for循环的情况下执行此操作?

函数nchoosek确实接受向量作为其第一个参数,但输出是向量中不同的3个元素。

2 个答案:

答案 0 :(得分:2)

利用阶乘与欧拉gamma函数之间的关系:

x = 3:10;
k = 3;
result = gamma(x+1)/gamma(k+1)./gamma(x-k+1);

更好的是,直接使用对数(使用gammaln)。这样,您就可以计算大xk而不会溢出。在末尾应用round以移除由有限数值精度引起的任何虚假小数部分。

result = round(exp(gammaln(x+1)-gammaln(k+1)-gammaln(x-k+1)));

x形式的kk+1,...(如您的示例所示)的另一种方法:

result = [1 cumprod(x(2:end)./(x(2:end)-k))];

答案 1 :(得分:2)

您还可以使用factorial功能并手动计算nchoosek。回想一下nchoosek

的公式

因此,我们可以使用factorial来帮助进行此计算,该计算还接受任何形状的数组和矩阵。因此,您的代码只是:

y = factorial(x) ./ (factorial(3) .* factorial(x-3));

鉴于x = 3:10,我们得到:

y =

     1     4    10    20    35    56    84   120

但是,如果您想为nchoosek(x, 3)的任何值执行x >= 3,您只需找到已关闭的表单表达式,并避免必须同时使用factorial。要实现您的目标,请使用nchoosek的上述表达式,只需将n替换为x,将k替换为3:

如您所见,您想要的内容简化为:

对于x的任何值,只要它大于或等于3.因此,对于x的每个值,只需计算元素方式,如下所示:

y = x.*(x-1).*(x-2) / 6;

鉴于x = 3:10,我们再次得到:

y =

     1     4    10    20    35    56    84   120