MATLAB - 将多个卷积掩码应用于单个矩阵

时间:2013-07-27 16:18:22

标签: matlab convolution

我需要将一个矩阵与许多其他矩阵卷积在一起,几乎没有召唤。

例如:我有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的并行化将是很好的

谢谢!

1 个答案:

答案 0 :(得分:0)

我假设您正在正确分配数组res?如果没有简单演示您的行为以及fms等的大小,我们只能猜测一下,以帮助您。如果矩阵的大小足够大,您可以查看FFT-based convolution methods(有convn on the Matlab File Exchange的内容。如果数据是稀疏的(> 50%零),您可以尝试将其转换为矩阵乘法并使用稀疏数据类型。如果您有gpuArray/convn,也可以尝试a decent one