使用区间的向量中元素的总和
Sum of elements in a vector using intervals
假设我有一个名为 vect = [1 2 3 4 5 6 7 8 9]
的矢量和另一个名为 intervals = [1 3 6 9]
的矢量。是否可以使用 intervals
获得 vest
中元素的部分和的另一个向量?我想做这样的事情:
部分和 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
间隔。现在,区间 [0, t) 中有多少来自 n
的值? [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)))
但它并没有真正起作用,或者我没有使用正确的东西。
对于第一个问题,我会使用这个:
cs = cumsum(vect);
i2 = intervals(2:end);
result = [cs(i2(1)), diff(cs(i2))]
result =
6 15 24
这将构建所有元素的cumulative sum,找到部分的末端,然后找到部分末端的总和之间的差异(恰好是元素的总和-之间)。
假设我有一个名为 vect = [1 2 3 4 5 6 7 8 9]
的矢量和另一个名为 intervals = [1 3 6 9]
的矢量。是否可以使用 intervals
获得 vest
中元素的部分和的另一个向量?我想做这样的事情:
部分和 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
间隔。现在,区间 [0, t) 中有多少来自 n
的值? [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)))
但它并没有真正起作用,或者我没有使用正确的东西。
对于第一个问题,我会使用这个:
cs = cumsum(vect);
i2 = intervals(2:end);
result = [cs(i2(1)), diff(cs(i2))]
result =
6 15 24
这将构建所有元素的cumulative sum,找到部分的末端,然后找到部分末端的总和之间的差异(恰好是元素的总和-之间)。