使用间隔的向量中的元素总和

时间:2016-03-21 03:15:02

标签: arrays matlab sum intervals accumarray

我们说我有一个名为vect = [1 2 3 4 5 6 7 8 9]的向量和另一个名为intervals = [1 3 6 9]的向量。是否可以使用vestintervals中获取另一个元素的部分和的向量?我想做这样的事情:

部分和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))),但它并没有真正起作用,或者我没有使用正确的东西。

1 个答案:

答案 0 :(得分:1)

对于第一个问题我会用这个:

cs = cumsum(vect);
i2 = intervals(2:end);
result = [cs(i2(1)), diff(cs(i2))]

result =

     6    15    24

这将构建所有元素的cumulative sum,找到零件的末端,然后找到零件末端的总和之间的差异(这正是两者之间元素的总和)