我需要将一个矩阵与许多其他矩阵进行卷积,而对 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 的并行化,那就太好了
谢谢!