使用for循环生成向量的元素

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)

我的代码是否远远接近我想要实现的目标?我该怎么办才能修复它?

the*_*alk 6

你不需要任何循环,只需直接使用向量.

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位数.


Lui*_*ndo 5

中等大数的因子可能导致溢出.两种可能的方法来防止:

  1. 避免计算将取消的术语.这种方法特别适用于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].

  2. 对于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)