矢量划分的部分和

时间:2015-08-10 07:08:15

标签: arrays matlab

如果有这样的矢量,则

T = [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16] 

(矢量T的大小可以灵活)

如何获得一系列'总和'

例如,

fn(T, 5) = [ (1+2+3+4+5) , (6+7+8+9+10), (11+12+13+14+15) , 16]

3 个答案:

答案 0 :(得分:6)

使用https://stackoverflow.com/a/31830176/4988990accumarray时,一个不需要在原始数组上填充零的选项:

div = 5;
out = accumarray(ceil((1:numel(T))/div).',T(:))

使用ceilcumsum代替的另一个选项:

div = 5;
T(ceil(numel(T)/div)*div) = 0;
cs = cumsum(T)
out = diff( [0 cs(div:div:end) ] )

修改:填充完成后,cumsumdiff有点矫枉过正,其中一个应该像diff一样继续。

答案 1 :(得分:5)

另一种方式,接近thewaywewalk的第二个选项:

div = 5;
T(ceil(numel(T)/div)*div) = 0;
out = sum(reshape(T,div,[])).'; % transpose if you really want a column vector

另外,一个单线解决方案(我更喜欢这个):

out = blockproc(T,[1 5], @(blk) sum(blk.data), 'PadPartialBlocks',true);

不要忘记设置参数' PadPartialBlocks',这是避免显式填充的关键。

答案 2 :(得分:4)

Communications System Toolbox中有一个内置函数vec2mat,可以将一个向量转换为一个二维矩阵,在每N个元素之后切割并放入单独的行,填充剩下的最后用零来保持2D尺寸。因此,在使用vec2mat之后,对所有行进行求和就足以为您提供所需的输出。这是实施 -

sum(vec2mat(T,5),2)

示例运行 -

>> T = 1:16;
>> vec2mat(T,5)
ans =
     1     2     3     4     5
     6     7     8     9    10
    11    12    13    14    15
    16     0     0     0     0
>> sum(vec2mat(T,5),2)
ans =
    15
    40
    65
    16