: 您好^^
: 小弟最近需要使用到MATLAB裡的conv2()這個函數
: 而是在C++裡完成這個動作
: 想問看看是否有現成的source code可以直接拿來用
: 就像FFT2可以用fftw裡的函數來執行一樣
: 麻煩好心人士幫忙了!!!!!!
: 感謝~~~~~~~~
:
: --
: ※ 發信站: 批踢踢實業坊(ptt.cc)
: ◆ From: 175.180.110.251
: → uranusjr:折積公式看一看自己實作應該比在這邊苦等還快... 05/10 08:48
: → angleevil:我也蠻想知道source code要怎麼找 05/10 10:05
: 推 purpose:google 搜尋,或丟新台幣懸賞 05/10 10:10
: 推 MarcusWayne:matlab 裡面不是可以看到函數的c code嗎? 05/10 12:14
恐怕不行,因為 matlab 的內建函數是用 java 寫的
(最底層是用 blas/lapack,有可能是用 intel math kernel library)
非內建函式則是用 matlab 寫的
剛好 conv2 並不是內建函式,所以可以看到 code
如果有裝 matlab 可以在這裡找到:
toolbox/eml/lib/matlab/datafun/conv2.m
因為有版權問題,我就不貼上來了
: → yanzichan:看來只好用用看GOOGLE或者自己寫了!! 05/10 15:50
: → yanzichan:但自己寫又怕效果很糟跑起來不快!!!!! 05/10 15:50
: → loveme00835:寫出來之後才有快不快的問題... 05/10 18:09
: → yanzichan:最後真的找不到!!!!! 05/10 20:14
: → yanzichan:就自己寫了XD 05/10 20:14
: → uranusjr:其實真的要優化可以去看 Octave 的原始碼 (爆) 05/10 21:16
這個就可以貼了
octave 解開來在 src/DLD-FUNCTIONS/conv2.cc
我在這裡放了一份 3.2.4 的:
http://codepad.org/4pFFaxtL
我看了一下 matlab 和 octave 的 code
大致上想法是這樣:
假設 conv2(A, B)
if size(A) < size(B)
交換 A and B
if Separable
(拆成 x 和 y 分開做 1D 的版本)
conv(A_, B_)
conv(A|, B|)
else
暴力做 convolution
剩下的就是實作上的 opmization 了
另外如果 A 和 B 的 size 都很大,而且很接近的話
conv2(A, B) = fft'( fft(A).*fft(B) ) 這樣會比較快
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.30.49