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 の並列化は素晴らしいことです。
ありがとうございました!