我们说我有一个名为vect = [1 2 3 4 5 6 7 8 9]
的向量和另一个名为intervals = [1 3 6 9]
的向量。是否可以使用vest
在intervals
中获取另一个元素的部分和的向量?我想做这样的事情:
部分和1 = 1 + 2 + 3(从vect(1)
到vect(3)
的元素)
部分和2 = 4 + 5 + 6(从vect(3 + 1)
到vect(6)
的元素)
部分和3 = 7 + 8 + 9(从vect(6 + 1)
到vect(9)
的元素)
所以我想要做的是获得第一个k
元素的总和,然后是从第一个元素开始的另一个k
元素的总和,而不是前一个总和等。
原始问题:
原始问题是这样的:我收到一个n
值和值k
的向量。让我们t = max(v) / k
间隔。现在,n
中有多少个值在区间[0,t]中?那么[t,t * 2]呢?那么[2 * t,3 * t]呢?到目前为止,我使用accumarray(v, 1)
来查找每个我有多少值以及int = (0:max(v)/k:max(v))
来构建invervals向量,但是现在我必须sum(accumarray(v, 1))
才能获得这些值部分金额。
如果您要使用此{http://pastebin.com/jCZ3qYhz:使用accumarray
生成)和k = 16
进行测试,则部分总和必须为:157,167,136,251,726, 1300,1152。我希望能够在没有for / while循环的情况下做到这一点:)矢量化是关键!
修改
为了得到我的第一笔钱,我使用它:sum(accumarray(v, 1)(1:16))
,第二项:sum(accumarray(v, 1)(17:32))
,但我不知道如何对此操作进行矢量化。我试过这个:i = (1:16:500)
。然后是sum(accumarray(v, 1)(i(1:length(i)) : i(2:length(i)))
,但它并没有真正起作用,或者我没有使用正确的东西。
答案 0 :(得分:1)
对于第一个问题我会用这个:
cs = cumsum(vect);
i2 = intervals(2:end);
result = [cs(i2(1)), diff(cs(i2))]
result =
6 15 24
这将构建所有元素的cumulative sum,找到零件的末端,然后找到零件末端的总和之间的差异(这正是两者之间元素的总和)