1

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

  1. 我有一个数组 A = [2 3 4 5 8 9...]
  2. 我希望创建一个索引累积,例如 s(1) = 2; s(2)=5,s(3)=9;... 等等

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

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

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

4

3 回答 3

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:x1减少sum了线性阵列。要正确执行此操作,您需要一个二维数组,然后对行求和:

s(x)=sum(triu(repmat(A,[prod(size(A)) 1])'))
于 2013-10-17T02:28:06.843 回答
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()”......

于 2013-10-17T02:39:06.743 回答
0

实际上你正在做的是 s(1:10)= sum(A(1:[1,2,3...10])) 你应该做的是

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

希望对你有帮助

于 2013-10-17T02:48:48.683 回答