2016-06-21 10 views
0

私のマトリックスAのサイズをsx x sy x szとしましょう。私はAと同じ位置から抽出されたn x n x nサブマトリクスの平均を表す(x,y,z)のBの要素がAにある行列BAと同じサイズ)を取得したいと思います。Matlabの3Dサブマトリックスの高速平均化

どうすればいいですか?

convnを使用するか、または3 forループを使用してこれを行うことができますが、非常に遅いでしょう。私はn = 9は約20〜30秒かかります使用する場合

行列サイズ200 x 200 x 150Aは私のマシン上でdouble精度です。

+0

'convn'はこれを行う最も速い方法でしょう。それがあなたにとって遅すぎるとすれば、私たちはおそらく示唆することはあまりありません。 – Suever

+1

利用可能な場合は、GPUを悪用しようとします。 GPUは畳み込みを行う際に優れています。 –

+0

お使いのマシンの仕様を教えていただけますか?私にとっては、平均で約1秒かかります。比較的大量のデータと指定したカーネルではかなり速いと思います。単にパフォーマンスを制限しているマシンである可能性があります。 – rayryeng

答えて

3

Image Processing Toolboxのimfilterを使用することを検討してください。 imfilterは本質的にIntel Integrated Performance Primitivesを利用する最適化された畳み込みおよび相関パイプラインです。ただ、簡単なテストとして、のは、ランダムdouble精度200×200×150の3Dマトリックスを作成してみましょう、あなたが言ったように、我々は、9×9×9ピクセル地区の平均を見つけたい:

A = rand(200,200,150); 
kernel = (1/9^3)*ones(9,9,9); 
B = imfilter(A, kernel); 

これは実際には非常に高速に動作します私のマシンで。私の仕様は、2.3GHzのIntel Core i7プロセッサを搭載した16GBのRAMを搭載したMacBook Proです。

ちょうど好奇心を満たすために、私はあなたがカーネルお​​よびマトリックス割り当てるたら、この操作にかかる時間の時間にtimeitを使用:

:平均して

A = rand(200,200,150); 
kernel = (1/9^3)*ones(9,9,9); 
B = imfilter(A, kernel); 
t = timeit(@() imfilter(A, kernel)); 

を、上記のコードを約1.1393秒間動作します

>> t 

t = 

    1.1393 

あなたがGPUに移行しない限り、これは私が今までに得ようとしている最速の方法です...特に、150個の200 x 200の2Dデータがあるため、 9×9×9体積の要素。