MATLAB:向量的选择

MATLAB: nchoosek of a vector

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

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

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

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

更好的是,直接使用对数(在最后使用 gammaln). This will let you compute for large x and k without overflow. Apply round 以删除由有限数值精度引起的任何虚假小数部分。

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

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

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

您也可以使用 factorial 函数并手动计算 nchoosek。回忆 nchoosek 的公式:

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

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

给定 x = 3:10,我们得到:

y =

     1     4    10    20    35    56    84   120

但是,如果您想对 x >= 3 的任何值执行 nchoosek(x, 3),您可以简单地找到封闭形式的表达式,而不必一起使用 factorial。要实现您的愿望,请使用上述表达式 nchoosek 并简单地将 n 替换为 x 并将 k 替换为 3:

如你所见,你想要的简化为:

对于 x 的任何值,只要它大于或等于 3。因此,对于 x 的每个值,只需计算一个 element-wise 表达式,如下所示:

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

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

y =

     1     4    10    20    35    56    84   120