【问题标题】:MATLAB - apply multiple convolution masks to a single matrixMATLAB - 将多个卷积掩码应用于单个矩阵
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 在小矩阵上的操作很多。不稀疏。但重点不是如何使每个卷积尽可能快,而是如何尽可能快地将所有卷积掩码应用于矩阵 - 如果可能的话,比在掩码上循环更快。并行循环也很好,但由于开销可能不值得 - 这就是我正在寻找替代方案的原因
  • 我已经编辑了我的问题并添加了一些说明。我不想使用 FFT,因为据我了解,它不如普通卷积准确,并且对于相对较小的矩阵没有那么有用。
  • @user1999728:如果矩阵很小(但是“小”是什么意思?),基于 FFT 的卷积可能无济于事。但是,如果将FFT-based convn method 应用于许多小矩阵,也许仍然会有好处。
  • 小我的意思是目前 9x9,最多我会使用 21x21 矩阵(虽然很可疑)我忘了提到 - 是的。我正在预分配res。无论如何,正如我通过编辑我的原始问题所澄清的那样,问题是对函数的调用量,我试图通过减少调用convn 的次数来减少它,或者找到一种方法来进行多重卷积而无需顺序循环。但是,我将探索基于 FFT 的卷积,看看我是否可以从中受益更多。谢谢!
  • @user1999728: 做一个简单的测试,正如实现的那样,我上面链接的convnfft 函数似乎对你提到的大量小矩阵没有任何好处(事实上,在矩阵比你的大一点之前它会更慢)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-17
  • 1970-01-01
  • 2019-07-12
  • 2014-11-26
  • 1970-01-01
相关资源
最近更新 更多