【问题标题】:Wrote a convolution function, but it's over 200 times slower than conv2() in matlab..?写了一个卷积函数,但是比matlab中的conv2()慢200多倍..?
【发布时间】:2016-11-09 05:43:16
【问题描述】:

所以我写了这个:

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 optimization computer-vision convolution


【解决方案1】:

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

【讨论】:

  • 有趣。我不熟悉快速傅里叶变换;我得调查一下。你知道是什么让 FFT 变得如此之快,以及为什么 C++ 比 matlab 快吗?
  • FFT 的简短答案:更少且恒定的操作数。对于 MatLab,它是一种没有类型的脚本语言,当 C++ 被编译和高度优化时。所以 MatLab 本身是最慢的语言之一,但在可能的情况下,它会调用 C++ 函数来执行操作,例如对矩阵的操作、FFT 等。
  • 嗯,好的,谢谢!是否值得弄清楚如何使用 FFT 编写我自己的卷积函数,还是应该放弃它并使用 conv2()?
  • 您知道 conv2 已经过优化、测试等,因此它可以工作并且运行速度很快!所以如果你只想使用 MatLab,那么 conv2 是最好的选择。如果您想构建自己的 C++ 库,它已经存在许多高度优化的 FFT 库。
  • @FiReTiTi 您是否有任何参考资料表明 matlab 实际上在引擎盖下使用了 FFT?从官方document看来好像是在做空间卷积。
猜你喜欢
  • 1970-01-01
  • 2022-10-06
  • 2016-09-05
  • 2013-04-13
  • 1970-01-01
  • 1970-01-01
  • 2020-06-07
  • 2010-12-22
  • 1970-01-01
相关资源
最近更新 更多