0

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

vect(1)部分和 1 = 1 + 2 + 3(从到 的元素vect(3)

vect(3 + 1)部分和 2 = 4 + 5 + 6(从到 的元素vect(6)

vect(6 + 1)部分和 3 = 7 + 8 + 9(从到 的元素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))),但它并没有真正起作用,或者我没有使用正确的东西。

4

1 回答 1

1

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

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

result =

     6    15    24

这将构建所有元素的累积和,找到部分的末端,然后找到部分末端的总和之间的差异(这正是中间元素的总和)。

于 2016-03-21T04:00:24.140 回答