写了一个卷积函数,但是它比 matlab 中的 conv2() 慢了 200 多倍..?
Wrote a convolution function, but it's over 200 times slower than conv2() in matlab..?
所以我写了这个:
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 循环吗?
Matlab 使用 FFT 来执行卷积 Conv = FFTinv(FFT(Image) x FFT(Kernel))
,这比经典卷积快得多。更具体地说,Matlab调用一个C++库来执行FFT,比Matlab快几十倍。
所以我写了这个:
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 循环吗?
Matlab 使用 FFT 来执行卷积 Conv = FFTinv(FFT(Image) x FFT(Kernel))
,这比经典卷积快得多。更具体地说,Matlab调用一个C++库来执行FFT,比Matlab快几十倍。