在向量中一起添加不同的K值块

时间:2015-11-20 19:51:35

标签: matlab vectorization

我有一个名为

的矢量
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整除。对于专家来说,这可能是一个愚蠢的问题,但我真的很感激这种情况下的指导。

3 个答案:

答案 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(:));