0

convn をほとんど呼び出さずに、行列を他の多くの行列と畳み込む必要があります。

例:私は持ってい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次元の各要素の畳み込みをループで計算するためです)

主な目標は単純に、次のループの必要性をなくすこと、または可能な場合はオーバーヘッドを最小限に抑えて並列化することです。

for i=1:length
res(:,:,:,i)=convn(MyArray,convMask(:,:,i));
end

通常の parfor よりも少ないオーバーヘッドでこれを行う方法があれば、GPU の並列化は素晴らしいことです。

ありがとうございました!

4

1 に答える 1