分批/并行进行一维卷积

时间:2018-08-21 14:15:30

标签: matlab matrix vectorization convolution

我有以下代码,基本上是对二维矩阵的每一行进行一维卷积。卷积核是相同的。真的是SIMD案例。

a = [   1,2,3,4,5;
        6,7,8,9,7; 
        7,6,2,3,4; 
        23, 54, 1, 3 ,7];

f = [1,2,3];


for n = 1:size(a,1)
    conv(a(n,:),f,'same')
end

当矩阵大小(和内核大小)变大时,速度确实成为问题。我想知道有没有办法批量处理(并行化此过程)?

我做了类似的事情,但是结果与上面的代码不同:

a = [   1,2,3,4,5;
        6,7,8,9,7; 
        7,6,2,3,4; 
        23, 54, 1, 3 ,7];

f = [1,2,3];

ff = repmat(f, [size(a,1) 1]);

for n = 1:size(a,1)
    conv(a(n,:),f,'same')
end

convn(a,ff,'same')

conv2(f,2,a,'same')

请告知。谢谢。

PS: 我目前只在寻求使用卷积的解决方案,而不是使用等效的fft。

1 个答案:

答案 0 :(得分:4)

您将要使用二维卷积:

conv2(1, f, a, 'same')

conv2(a, f, 'same')

在第一种方法中,第一个参数是1,因为它是按列的卷积,并且根据您所说的,您只想进行行卷积,这需要使用第二个参数, f

来自conv2的Matlab文档:

  

C = conv2(H1,H2,A)首先将A的每一列与向量进行卷积       H1,然后将结果的每一行与向量H2卷积。

沿着列对标量1进行卷积是一个标识操作,允许f向量沿原始矩阵行进行卷积,这是理想的结果。

对于上述第二种方法,这是两个输入矩阵的直接二维卷积,因此,如果您仔细了解输入维和参数顺序,实际上可以执行更快的操作。