如果有这样的矢量,则
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]
答案 0 :(得分:6)
使用https://stackoverflow.com/a/31830176/4988990和accumarray
时,一个不需要在原始数组上填充零的选项:
div = 5;
out = accumarray(ceil((1:numel(T))/div).',T(:))
div = 5;
T(ceil(numel(T)/div)*div) = 0;
cs = cumsum(T)
out = diff( [0 cs(div:div:end) ] )
修改:填充完成后,cumsum
和diff
有点矫枉过正,其中一个应该像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