让x = [3:10]
。我想为每个nchoosek(x(i),3)
找到i
。是否有一个函数(或更好的方法)在不使用for
循环的情况下执行此操作?
函数nchoosek
确实接受向量作为其第一个参数,但输出是向量中不同的3个元素。
答案 0 :(得分:2)
利用阶乘与欧拉gamma
函数之间的关系:
x = 3:10;
k = 3;
result = gamma(x+1)/gamma(k+1)./gamma(x-k+1);
更好的是,直接使用对数(使用gammaln
)。这样,您就可以计算大x
和k
而不会溢出。在末尾应用round
以移除由有限数值精度引起的任何虚假小数部分。
result = round(exp(gammaln(x+1)-gammaln(k+1)-gammaln(x-k+1)));
x
形式的k
,k+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