我需要将一个矩阵与许多其他矩阵卷积在一起,几乎没有召唤。
例如:我有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的并行化将是很好的
谢谢!
答案 0 :(得分:0)
我假设您正在正确分配数组res
?如果没有简单演示您的行为以及fm
,s
等的大小,我们只能猜测一下,以帮助您。如果矩阵的大小足够大,您可以查看FFT-based convolution methods(有convn
on the Matlab File Exchange的内容。如果数据是稀疏的(> 50%零),您可以尝试将其转换为矩阵乘法并使用稀疏数据类型。如果您有gpuArray/convn
,也可以尝试a decent one。