在 batches/parallel 中进行一维卷积
doing 1-d convolution in batches/parallel
我有以下代码,基本上是对二维矩阵的每一行进行一维卷积。卷积核是一样的。确实是 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。
您需要使用二维卷积:
conv2(1, f, a, 'same')
或
conv2(a, f, 'same')
在第一种方法中,第一个参数是1
,因为它是一个列卷积,根据你所说的,你只想做行卷积,这是用第二个来处理的参数,f
.
来自 conv2
的 Matlab 文档:
C = conv2(H1, H2, A) first convolves each column of A with the vector
H1 and then convolves each row of the result with the vector H2.
沿列对标量 1
进行卷积是恒等运算,允许 f
向量沿原始矩阵行进行卷积,这是期望的结果。
对于上面的第二种方法,这是两个输入矩阵的直接二维卷积,所以如果你注意理解你的输入维度和参数顺序,这实际上执行得更快。
我有以下代码,基本上是对二维矩阵的每一行进行一维卷积。卷积核是一样的。确实是 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。
您需要使用二维卷积:
conv2(1, f, a, 'same')
或
conv2(a, f, 'same')
在第一种方法中,第一个参数是1
,因为它是一个列卷积,根据你所说的,你只想做行卷积,这是用第二个来处理的参数,f
.
来自 conv2
的 Matlab 文档:
C = conv2(H1, H2, A) first convolves each column of A with the vector H1 and then convolves each row of the result with the vector H2.
沿列对标量 1
进行卷积是恒等运算,允许 f
向量沿原始矩阵行进行卷积,这是期望的结果。
对于上面的第二种方法,这是两个输入矩阵的直接二维卷积,所以如果你注意理解你的输入维度和参数顺序,这实际上执行得更快。