【发布时间】:2013-07-27 19:40:05
【问题描述】:
我需要将一个矩阵与许多其他矩阵进行卷积,而对 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 的卷积可能会减慢它的速度(正如评论者在此验证的那样:))
(我在MyMat 的大小上有一个 1 的原因是因为我实际上在那个维度中有更多的元素,但是我在循环中计算了 那个 维度中每个元素的卷积)
主要目标只是消除对以下循环的需求,或者尽可能以很少的开销使其并行:
for i=1:length
res(:,:,:,i)=convn(MyArray,convMask(:,:,i));
end
如果有一种方法可以以比通常的 parfor 更少的开销来实现这一点,那么 GPU 的并行化会很棒
谢谢!
【问题讨论】:
-
“小”是什么意思? 10×10 还是 100×100?
-
矩阵大小可以在 1x1x10x1000 到 9x9x20x1000 之间的任何地方,但卷积将在大小最大为 9x9x1x1000(未来可能为 21x21x1x1000)的矩阵之间。卷积将应用于多个掩码,这将占第 3 维
标签: matlab convolution