2013-07-27 48 views
0

我需要使用許多其他矩陣來卷積矩陣,並且只需幾個呼叫即可進行convn。MATLAB - 將多個卷積蒙版應用於單個矩陣

例如:我有size(MyMat)=[fm, fm ,1, bSize]size(masks)=[s, s, maskNum]

我想res(:,:,k,:)是卷積masks(:,:,k)的產物與MyMat

res(:,:,k,:)=convn(MyMat,masks(:,:,k));

由於卷積過的運行時間80%的佔用我的腳本被稱爲數十萬次,我不想使用循環。

我正在尋找最快的方式來做到這一點。基本上,你可以說我有bSize矩陣,我想用卷積掩碼masks對所有的卷積進行儘可能少的調用。

矩陣都是小的,非稀疏,基於FFT的卷積可能會慢下來(這裏驗證:)一評註)

(我之所以有1的MyMat大小是因爲我實際上有更多的元素在這個維度,但我計算每個元素的卷積維度在一個循環)

主要目標是簡單地消除對以下循環的需要,或使其與非常平行如果可能,開銷不大:

如果有一種方法比平常開銷少做這個PARFOR

謝謝210

並行的GPU將是巨大的!

+0

「小」是什麼意思? 10乘10 ish或100乘100 ish? – horchler

+0

矩陣大小可以在1x1x10x1000到9x9x20x1000之間的任何位置,但卷積可能在尺寸高達9x9x1x1000的矩陣之間(未來可能爲21x21x1x1000)。卷積將應用多個掩碼,這將佔據第三維 – user1999728

回答

0

我假設你正確地預先分配了數組res?如果沒有簡單的演示,你可以做什麼,並且想出一個大小爲fms等的想法,那麼你只能猜測來幫助你。如果矩陣的大小足夠大,可以查看FFT-based convolution methods(有一些用於convnon the Matlab File Exchange)。如果數據稀疏(> 50%零),則可以嘗試將其轉換爲矩陣乘法並使用稀疏數據類型。如果您有a decent one,您也可以嘗試gpuArray/convn

+0

這是對小矩陣的很多操作。不稀疏。但關鍵並不在於如何儘可能快地使每個卷積儘可能快地進行,而是如何儘可能快地將所有卷積掩模應用於矩陣 - 如果可能的話,要比在掩模上循環更快。 並行循環也很好,但它可能不值得,因爲我開始尋找替代品 – user1999728

+0

我編輯了我的問題並添加了一些說明。我不想使用FFT,因爲據我所知,它比正常卷積更不準確,而且對於相對較小的矩陣不太有用。 – user1999728

+0

@ user1999728:如果矩陣很小(但是「小」是什麼意思?),基於FFT的卷積可能沒有幫助。然而,也許是[基於FFT的'convn'方法](http://www.mathworks。com/matlabcentral/fileexchange/24504-fft-based-convolution)如果應用在很多小矩陣上仍然是有益的。 – horchler