加速卷积计算代码

Speed up convolution computation code

我在 MATLAB 中有以下代码

[Mx,Nx] = size(x);
[My,Ny] = size(y);

padded_x = zeros(Mx+2*(My-1),Nx+2*(Ny-1));
padded_x(My:Mx+My-1,Ny:Ny+Nx-1) = x; 
y = rot90(y,2);

z = zeros(Mx+My-1,Nx+Ny-1);
for i=1:Mx+My-1
    for j=1:Nx+Ny-1
        z(i,j) = sum(sum(padded_x(i:i+My-1,j:j+Ny-1).*y));
    end
end

这是二维卷积实现的一部分。有什么办法可以让它变得更快?例如向量化这 2 个 for 循环? 我知道有更快的算法可以计算 2D 卷积,但我想加快这个速度。所以,我不是在寻找具有不同复杂度的算法,只是在寻找具有较低复杂度常数的算法。我还想将它保留在 MATLAB 中,而不是使用 MEX - 文件等。最后,提供的 conv2 函数也不是我正在寻找的解决方案。

对于每次迭代,您可以用 fast matrix multiplication.

替换逐元素乘法和双重求和

也就是-

z(i,j) = sum(sum(padded_x(i:i+My-1,j:j+Ny-1).*y));

将替换为 -

M = padded_x(i:i+My-1,j:j+Ny-1);
z(i,j) = M(:).'*y(:);

因此,原始代码的循环部分可以替换为 -

z = zeros(Mx+My-1,Nx+Ny-1);
yr = y(:);
for i=1:Mx+My-1
    for j=1:Nx+Ny-1
         M = padded_x(i:i+My-1,j:j+Ny-1);
        z(i,j) = M(:).'*yr;
    end
end

快速测试: xy 分别为 200 x 200,运行时间为 -

------------------------- With Original Approach
Elapsed time is 10.357977 seconds.
------------------------- With Proposed Approach
Elapsed time is 5.209822 seconds.