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

0

我假设您res正确地预分配了数组?如果没有一个简单的演示来说明你在做什么,也不知道 , 等的大小fms你只能做出猜测来帮助你。如果矩阵的大小足够大,您可能会研究基于 FFT 的卷积方法(convn 在 Matlab File Exchange 上有一些方法)。如果数据稀疏(> 50% 零),您可以尝试将其转换为矩阵乘法并使用稀疏数据类型。gpuArray/convn如果你有一个像样的,你也可以试试。

于 2013-07-27T16:59:44.720 回答