我有一个名为
的矢量A= [2;3;4;5;6;7];
我想介绍一个名为K
的变量。如果'K'的值是1
,那么我将得到与输出相同的值。但是,如果K
的值为2
,那么我期望输出向量为:
output= [2+3;4+5;6+7];
如果K
的值为3
,那么我的输出将为:
output= [2+3+4;5+6+7];
此外,我们可以安全地假设A
中的元素总数可以被K
整除。对于专家来说,这可能是一个愚蠢的问题,但我真的很感激这种情况下的指导。
答案 0 :(得分:4)
假设A
中的元素数量可以被K
整除,您可以使用一些重塑和求和,就像这样 -
sum(reshape(A,K,[]),1)
示例运行
输入:
A =
2
3
4
5
6
7
运行#1:
>> K = 2;
>> reshape(A,K,[])
ans =
2 4 6
3 5 7
>> sum(reshape(A,K,[]),1)
ans =
5 9 13
运行#2:
>> K = 3;
>> reshape(A,K,[])
ans =
2 5
3 6
4 7
>> sum(reshape(A,K,[]),1)
ans =
9 18
如果A中的元素数量不能被K整除,您可以使用Communications System Toolbox
中的vec2mat
,就像这样 -
sum(vec2mat(A,K).',1) %// OR sum(vec2mat(A,K),2)
示例运行
A =
2
3
4
5
6
7
8
9
运行#1:
>> K = 2;
>> vec2mat(A,K).'
ans =
2 4 6 8
3 5 7 9
>> sum(vec2mat(A,K).',1)
ans =
5 9 13 17
运行#2:
>> K = 3;
>> vec2mat(A,K).'
ans =
2 5 8
3 6 9
4 7 0
>> sum(vec2mat(A,K).',1)
ans =
9 18 17
答案 1 :(得分:3)
另一种方法是将内核的卷积作为全1并且内核的长度为K
,但复杂的是你跳过每{{1}结果中的元素,因为它使用滑动窗口将元素加在一起。
简单地说:
K
这种方法的好处在于,您不必假设output = conv(A, ones(K,1), 'valid');
output = output(1:K:end);
的总长度可以被A
整除。
K
答案 2 :(得分:1)
即使A
的大小不是K
的倍数,另一个解决方案是定义分组索引并应用accumarray
:
result = accumarray(ceil((1:numel(A)).'/K),A(:));