我正在尝试使用公式
进行计算我希望将每个值存储到行向量中。这是我的尝试:
multiA = [1];
multiB = [];
NA = 6;
NB = 4;
q = [0,1,2,3,4,5,6];
for i=2:7
multiA = [multiA(i-1), (factorial(q(i) + NA - 1))/(factorial(q(i))*factorial(NA-1))];
%multiA = [multiA, multiA(i)];
end
multiA
但这不起作用。我收到错误消息
Attempted to access multiA(3); index out
of bounds because numel(multiA)=2.
multiA = [multiA(i-1), (factorial(q(i)
+ NA -
1))/(factorial(q(i))*factorial(NA-1))];
我的代码是否远远接近我想要实现的目标?我该怎么做才能解决它?
答案 0 :(得分:6)
您不需要任何循环,只需直接使用矢量。
NA = 6;
q = [0,1,2,3,4,5,6];
multiA = factorial(q + NA - 1)./(factorial(q).*factorial(NA-1))
给出
multiA =
1 6 21 56 126 252 462
对于多个N
,不需要循环:
N = [6,8,10];
q = [0,1,2,3,4,5,6];
[N,q] = meshgrid(N,q)
multiA = factorial(q + N - 1)./(factorial(q).*factorial(N-1))
另请考虑以下关于n > 21
溢出的评论:
f = factorial(n)
<强>限制强>
结果仅对于小于或等于21的n的双精度值是准确的。更大的n值产生的结果是 具有正确的数量级,并且对于前15个是准确的 数字。这是因为双精度数字只是准确的 到15位数。
对于单精度输入,结果仅对n小于或等于13的值精确.n值越大,产生的 结果具有正确的数量级并且准确无误 前8位数。这是因为只有单精度数字 精确到8位数。
答案 1 :(得分:5)
中等数量的因子可能导致溢出。两种可能的方法来防止:
避免计算会取消的字词。这种方法特别适用于q
形式为1,2的情况,......如您的示例所示。它的优点还在于,对于q
的每个值,重新使用前一个值的结果,从而最大限度地减少操作次数:
>> q = 1:6;
>> multiA = cumprod((q+NA-1)./q)
multiA =
6 21 56 126 252 462
请注意0
中不允许q
。但0
的结果只是1
,因此最终结果只是[1 multiA]
。
对于q
任意(不一定是1,2,...形式),您可以使用gammaln
函数,该函数提供对数阶乘:
>> q = [0 1 2 6 3];
>> multiA = exp(gammaln(q+NA)-gammaln(q+1)-gammaln(NA));
>>multiA =
1.0000 6.0000 21.0000 462.0000 56.0000
答案 2 :(得分:1)
您想在“multiA”的末尾附加一个新元素:
for i=2:7
multiA = [multiA, (factorial(q(i) + NA - 1))/(factorial(q(i))*factorial(NA-1))];
end
函数句柄使其更简单:
%define:
omega=@(q,N)(factorial(q + N - 1))./(factorial(q).*factorial(N-1))
%use:
omega(0:6,4) %q=0..6, N=4
答案 3 :(得分:1)
最好使用nchoosek
而不是factorial
。后者可以很容易地溢出,我想。
multiA=nan(1,7);
for i=1:7
multiA(i)=nchoosek(q(i)+N-1, q(i));
end