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)));
另一种方法,对于 k
、k+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
让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)));
另一种方法,对于 k
、k+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