我正在尝试解决为什么以下 Matlab 语法不起作用。
- 我有一个数组 A = [2 3 4 5 8 9...]
- 我希望创建一个索引累积,例如 s(1) = 2; s(2)=5,s(3)=9;... 等等
有人可以解释为什么以下不起作用
x = 1:10
s(x) = sum(A(1:x))
逻辑是,如果使用 x 为 s 创建一个向量,为什么 sum 函数的行为方式不一样?以上仅返回所有 x 的第一个元素 (2)。
为了计算累积和,您应该使用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:x
这1
减少sum
了线性阵列。要正确执行此操作,您需要一个二维数组,然后对行求和:
s(x)=sum(triu(repmat(A,[prod(size(A)) 1])'))
你问了两个问题,真的。一个是 - 我如何计算累积和。@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()
”......
实际上你正在做的是 s(1:10)= sum(A(1:[1,2,3...10])) 你应该做的是
for i=1:10
s(i)=sum(A(1:i))
end
希望对你有帮助