有人知道计算卷积的最快方法吗?不幸的是,我处理的矩阵非常大(500x500x200),如果我在MATLAB中使用convn
,它会花费很长时间(我必须在嵌套循环中迭代此计算)。因此,我将卷积与FFT一起使用,现在速度更快。但是,我仍在寻找一种更快的方法。任何想法?
最佳答案
如果您的内核是可分离的,则可以通过执行多个顺序的一维卷积来最大程度地提高速度。
MathWorks的Steve Eddins描述了当内核在his blog上的MATLAB上下文中是可分离的时,如何利用卷积的关联性来加快卷积。对于P-by-Q
内核,执行两个单独的和顺序的卷积与2D卷积的计算优势是PQ/(P+Q)
,它对应于9x9内核的4.5x和15x15内核的〜11x。 编辑:在this Q&A中给出了对此差异的有趣的不知不觉的演示。
为了确定内核是否可分离(即两个 vector 的外积),博客goes on to describe如何检查内核是否可与SVD分离以及如何获取一维内核。他们的示例是针对2D内核的。有关N维可分离卷积的解决方案,请检查this FEX submission。
值得指出的另一个资源是this SIMD (SSE3/SSE4) implementation of 3D convolution by Intel,它同时包含source和presentation。该代码用于16位整数。除非您使用GPU(例如cuFFT),否则可能很难获得比Intel的实现更快的速度,后者也包括Intel MKL。 this page of the MKL documentation的底部有3D卷积(单精度浮点数)的示例(链接已固定,现在已在https://stackoverflow.com/a/27074295/2778484中进行镜像)。
关于c++ - 计算卷积的最快方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20554666/