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体積の要素。
'convn'はこれを行う最も速い方法でしょう。それがあなたにとって遅すぎるとすれば、私たちはおそらく示唆することはあまりありません。 – Suever
利用可能な場合は、GPUを悪用しようとします。 GPUは畳み込みを行う際に優れています。 –
お使いのマシンの仕様を教えていただけますか?私にとっては、平均で約1秒かかります。比較的大量のデータと指定したカーネルではかなり速いと思います。単にパフォーマンスを制限しているマシンである可能性があります。 – rayryeng