有人知道计算卷积最快的方法吗?不幸的是,我处理的矩阵非常大(500x500x200),如果我使用convn
在 MATLAB 中,这需要很长时间(我必须在嵌套循环中迭代此计算)。所以,我使用了 FFT 卷积,现在速度更快了。但是,我仍在寻找更快的方法。任何想法?
如果您的内核是可分离的,则通过执行多个连续的一维卷积将实现最大的速度增益。
MathWorks 的 Steve Eddins 描述了当内核在 MATLAB 上下文中可分离时,如何利用卷积的结合性来加速卷积his blog http://blogs.mathworks.com/steve/2006/10/04/separable-convolution/. For a P-by-Q
核,执行两个单独且连续的卷积与 2D 卷积相比的计算优势是PQ/(P+Q)
,这对应于 9x9 内核的 4.5x 和 15x15 内核的约 11x。EDIT:对这种差异的一个有趣的、无意的演示在本次问答 https://stackoverflow.com/questions/19283894/imfilter-speed-for-volumes.
要确定内核是否可分离(即两个向量的外积),博客继续描述 http://blogs.mathworks.com/steve/2006/11/28/separable-convolution-part-2/如何检查您的内核是否可与 SVD 分离以及如何获取一维内核。他们的示例是 2D 内核。对于 N 维可分离卷积的解决方案,请检查此 FEX 提交 http://www.mathworks.com/matlabcentral/fileexchange/27957-separable-n-dimensional-convolution.
另一个值得指出的资源是Intel 的 3D 卷积 SIMD (SSE3/SSE4) 实现 http://software.intel.com/en-us/articles/16bit-3d-convolution-sse4openmp-implementation-on-penryn-cpu,其中包括source http://software.intel.com/sites/default/files/96/15/conv3d.zip and a 推介会 http://software.intel.com/sites/default/files/72/18/convol3d16bit.ppt。该代码适用于 16 位整数。除非你转向 GPU(例如cuFFT https://developer.nvidia.com/cuFFT),可能很难比英特尔的实现更快,其中还包括英特尔MKL http://software.intel.com/en-us/articles/the-intel-math-kernel-library-and-its-fast-fourier-transform-routines。底部有一个3D卷积(单精度浮点数)的例子MKL 文档的此页 https://software.intel.com/en-us/node/471390(链接已修复,现在镜像在https://stackoverflow.com/a/27074295/2778484 https://stackoverflow.com/a/27074295/2778484).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)