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

时间:2014-02-11 23:17:39

标签: arrays matlab for-loop

我正在尝试使用公式enter image description here

进行计算

我希望将每个值存储到行向量中。这是我的尝试:

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))];

我的代码是否远远接近我想要实现的目标?我该怎么做才能解决它?

4 个答案:

答案 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)

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

  1. 避免计算会取消的字词。这种方法特别适用于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]

  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
    

答案 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