2016-11-08 4 views
2

は、だから私は、この書いた:畳み込み関数を書きましたが、matlabのconv2()より200倍以上遅いです。

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 

とMATLABのCONV2がとりながら鉱山は、実行に4秒以上を要することがわかりました約0.01秒。さらに、私の出力はm + w-1 x n + z-1であるので、m-w + 1 x n-z + 1の行列を出力しているので、画像の外側にゼロの畳み込みを行うと仮定しています画像の端に私は結果を表示するとき、彼らは同じように見えるので、私の機能が動作している必要があります。それはずっと遅いですし、なぜ私は考えていません。何とかforループを取り除くことはできますか?

+0

'"何とかforループを取り除くことはできますか? " - http://stackoverflow.com/questions/25449279/efficient-implementation-of-im2col-and-col2im – Divakar

+0

これはおそらく、実行するには私はかなり確信しているが、感謝!前にim2colについて知らなかった – DZD

答えて

2

Matlabはコンボリューションを実行するためにFFTを使用します。Conv = FFTinv(FFT(Image) x FFT(Kernel))は古典的な畳み込みよりもはるかに高速です。より具体的には、MatlabはMatlabより数十倍高速なFFTを実行するためにC++ライブラリを呼び出します。

+0

興味深い。私は高速フーリエ変換に慣れていません。私はそれを調べなければならない。 FFTを非常に速くする理由と、C++がmatlabより高速である理由を知っていますか? – DZD

+1

[Convolution Theorem](https://en.wikipedia.org/wiki/Convolution_theorem)を参照してください。 – beaker

+0

FFTの短い答え:より少なく一定の操作数。 MatLabでは、C++が高度に最適化されたコンパイル時に、型のないスクリプト言語です。だから、MatLabはそれ自身で最も遅い言語の1つですが、可能であれば行列演算、FFTなどの演算を行うC++関数を呼び出します。 – FiReTiTi

関連する問題