写了一个卷积函数,但它比matlab中的conv2()慢了200多倍?

时间:2016-11-08 18:50:27

标签: matlab optimization computer-vision convolution

所以我写了这个:

function y = convolution(u,v)

[m,n] = size(u);
[w,z] = size(v);

y = zeros(m-w+1,n-z+1);
for i = 1:m-w+1
    for j = 1:n-z+1
        y(i,j) = sum(sum(u(i:i+w-1,j:j+z-1).*v));
        end
    end


    end

然后我将它与matlab中的conv2()进行比较:

function timedConv
a = im2double(rgb2gray(imread('picture.png')));

tic
convolution(a,[4 5 6;0 0 0;3 2 1]);
toc

tic
conv2(a,[4 5 6; 0 0 0; 3 2 1]);
toc
end

并且发现我的运行时间超过4秒,而matlab的conv2需要大约0.01秒。更重要的是,我的输出m-w + 1 x n-z + 1矩阵,而matlab输出m + w-1 x n + z-1,所以它是假设图像外部的行和列为零,以在图像的边缘上进行卷积。当我显示结果时,它们看起来一样,所以我的功能必须正常工作。它变得如此之慢,我不知道为什么......我可以以某种方式摆脱for循环吗?

1 个答案:

答案 0 :(得分:1)

Matlab使用FFT来执行卷积Conv = FFTinv(FFT(Image) x FFT(Kernel)),这比经典卷积快得多。更具体地说,Matlab调用C ++库来执行FFT,这比Matlab快几十倍。