我在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
这是2D卷积实现的一部分。有没有什么方法可以变得更快?例如矢量化这2个循环? 我知道有更快的算法来计算2D卷积,但我想加快这个速度。所以,我不是在寻找具有不同复杂度的算法,只是复杂度较低的算法。我还想在MATLAB中保留它,而不是使用MEX - 文件等。最后,提供的conv2功能也不是我想要的解决方案。
答案 0 :(得分:4)
对于每次迭代,您可以使用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
快速测试:每个x
和y
为200 x 200
,运行时间为 -
------------------------- With Original Approach
Elapsed time is 10.357977 seconds.
------------------------- With Proposed Approach
Elapsed time is 5.209822 seconds.