Mac*_*ack 0 arrays matlab for-loop
我试图用等式计算
我想将每个值存储到行向量中.这是我的尝试:
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
Run Code Online (Sandbox Code Playgroud)
但这不起作用.我收到错误消息
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))];
Run Code Online (Sandbox Code Playgroud)
我的代码是否远远接近我想要实现的目标?我该怎么办才能修复它?
你不需要任何循环,只需直接使用向量.
NA = 6;
q = [0,1,2,3,4,5,6];
multiA = factorial(q + NA - 1)./(factorial(q).*factorial(NA-1))
Run Code Online (Sandbox Code Playgroud)
给
multiA =
1 6 21 56 126 252 462
Run Code Online (Sandbox Code Playgroud)
对于多个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))
Run Code Online (Sandbox Code Playgroud)
还要考虑以下有关溢出的说明n > 21:
f = factorial(n)
Run Code Online (Sandbox Code Playgroud)
限制
结果仅对于小于或等于21的n的双精度值是准确的.较大的n值产生具有正确数量级的结果并且对于前15个数字是准确的.这是因为双精度数字最多只能精确到15位数.
对于单精度输入,结果仅对n小于或等于13的值精确.较大的n值产生的结果具有正确的数量级并且对于前8位数是准确的.这是因为单精度数字最多只能精确到8位数.
中等大数的因子可能导致溢出.两种可能的方法来防止:
避免计算将取消的术语.这种方法特别适用于q形式为1,2的情况,如...所示.它还具有以下优点:对于每个值q,重新使用先前值的结果,从而最小化操作的数量:
>> q = 1:6;
>> multiA = cumprod((q+NA-1)./q)
multiA =
6 21 56 126 252 462
Run Code Online (Sandbox Code Playgroud)
请注意,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
Run Code Online (Sandbox Code Playgroud)