向量的累积和 - 语法

时间:2013-10-17 02:04:23

标签: matlab syntax

我试图解决为什么以下Matlab语法不起作用。

  1. 我有一个数组 A = [2 3 4 5 8 9 ...]
  2. 我希望创建一个索引累积,例如 s(1)= 2; s(2)= 5,s(3)= 9; ......等等。
  3. 有人可以解释为什么以下不起作用

    x = 1:10
    s(x) = sum(A(1:x))
    

    逻辑是如果使用x为s创建向量,为什么sum函数的行为方式不一样?以上只返回所有x的第一个元素(2)。

3 个答案:

答案 0 :(得分:4)

要计算累积金额,您应该使用cumsum

>> A = [2 3 4 5 8 9]

A =

     2     3     4     5     8     9

>> cumsum(A)

ans =

     2     5     9    14    22    31

问题是1:x1sum会减少线性数组。要正确执行此操作,您需要一个二维数组,然后对行求和:

s(x)=sum(triu(repmat(A,[prod(size(A)) 1])'))

答案 1 :(得分:0)

你真的在问两个问题。一个是 - 我如何计算累积总和。 @ SouldEc的答案已经显示了cumsum函数如何做到这一点。你的另一个问题是

  
    

有人可以解释为什么以下不起作用

  
x = 1:10
s(x) = sum(A(1:x))

这是合理的 - 你认为矢量扩展应该转

1:x

1:1
1:2
1:3
1:4

等。但事实上,冒号运算符两边的参数必须是标量 - 它们本身不能是向量。我很惊讶你说Matlab没有用你的两行代码抛出一个错误 - 我本以为它会(我只是在Freemat上测试过它,并抱怨......)

所以更有趣的问题是 - 如何创建这些向量(如果你不知道/想要使用cumsum)?

在这里,我们可以使用arrayfun。它使用数组作为输入元素逐个元素来计算函数;这对于这样的情况很有用。所以,如果我们写

x = 1:10;
s = arrayfun(@(n)sum(A(1:n)), x);

这将循环遍历x的所有值,将它们替换为函数sum(A(1:n)),并且瞧 - 您的问题已解决。

但实际上 - 正确的答案是“使用cumsum()”......

答案 2 :(得分:0)

其实你在做什么 s(1:10)=总和(A(1:[1,2,3 ... 10]))  你应该做的是

for i=1:10
    s(i)=sum(A(1:i))
end

希望它会帮助你