矩阵值函数的离散 3D 卷积

计算科学 matlab 傅立叶分析 离散化
2021-12-08 01:23:02

如标题所述,我需要对两个矩阵值函数进行离散 3D 卷积。或者,实际上,我需要将矩阵值函数与向量值函数进行卷积。也就是说,我需要计算的离散版本(fX)(x)对于一些有限的集合x的,在哪里f:R3R3×3X:R3R3. 哦,我正在使用 MATLAB。

我的问题是,我如何以最快的方式做到这一点?我目前正在使用四个嵌套循环,不用说,这很慢。还有其他方法吗?

我曾考虑将其作为傅里叶空间中的乘法来代替。但是,考虑到这种情况,是否存在丢失某些信息或精度的风险?f实际上非常丑陋(一个奇怪的、缓慢衰减的函数,中间有一个洞)并且X是随机的(例如,实际上是一个随机过程)?

1个回答

如果使用傅立叶技术没有帮助,我会感到非常惊讶。此外,有人已经使用 FFT编写了用于 3D 快速卷积的 Matlab 代码;该作者对其进行了测试,发现:

Good usage recommendation: 
    In 1D, this function is faster than CONV for nA, nB > 1000. 
    In 2D, this function is faster than CONV2 for nA, nB > 20. 
    In 3D, this function is faster than CONVN for nA, nB > 5

其中 nA, nB 是输入向量 A,B 的长度。至少,您可以针对您的程序测试该输出以比较两者,而不必担心浪费时间自己编写基于傅里叶的方法并使其运行不佳。

也就是说,您可能对使用函数的傅里叶变换保持谨慎是正确的。这些功能是如何赋予你的?如果它们是从一组离散的点开始定义的,您不必担心;离散傅里叶变换毕竟是可逆的。

但是,如果给你一些分析表达式,在所有 3 空间中定义它们——例如,X是布朗表——那么你可能有麻烦了。在这种情况下,在有限数量的点对它们进行采样并使用离散傅里叶变换可能会丢弃场的高频分量或将它们混叠为低频。缺乏平滑是阻碍傅立叶分析的原因。

最后,如果这些问题确实妨碍您使用 FFT,您可以尝试使用 Matlab 的并行编程工具箱来加速您的嵌套循环。还值得考虑执行这些循环的顺序。A(:,i)Matlab 以列优先顺序存储数组,因此访问比访问快得多A(i,:)以一种方式而不是另一种方式嵌套循环可能会显着减慢程序的速度,因为它必须在内存中进行大量跳过而不是连续读取条目。