我试图解决为什么以下Matlab语法不起作用。
有人可以解释为什么以下不起作用
x = 1:10
s(x) = sum(A(1:x))
逻辑是如果使用x为s创建向量,为什么sum函数的行为方式不一样?以上只返回所有x的第一个元素(2)。
答案 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:x
是1
而sum
会减少线性数组。要正确执行此操作,您需要一个二维数组,然后对行求和:
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
希望它会帮助你