将三重嵌套循环计算为卷积乘积?

计算科学 傅里叶变换 fftw 卷积
2021-12-02 17:09:50

我正在尝试有效地计算以下内容

Aj=l=1k=0K1LlTke2πikKjϵl,k
为了j=0,1,,K2,K1, 在哪里Ll(维数 ) 和 (维数 ) 是复数的一维向量,而是复数的二维矩阵 (维数 : )。NLTkWϵL×W

在数值上,我对进行求和,其中是一个整数,必须选择足够大(以满足在这种情况下不重要的条件),因此产生 的截断求和的索引取模。l1NLN

Aj=l=1NLk=0K1LlTke2πikKjϵlmodL,k,
lϵlmodL,k

虽然根据三个嵌套 for 循环(两个用于上述 double sum 和第三个用于所有的简单(但幼稚)实现工作正常,但它非常慢,特别是考虑到要重复此实现对于每个时间步长(其中有很多)。Ajj

因此,我正在寻找上述方法的有效实现,它看起来非常像 2D 可分离卷积产品。这将允许人们利用 FFT 来非常有效地计算它,利用在频域中,卷积变成复数的乘法。

有人知道吗?

1个回答

让我们把它写成

Aj=l=1NLSjlLl

在哪里

Sjl=k=0K1[TkϵlmodR,k]e2πikKj

(我使用 R 表示行数,重用 L 太混乱了)

最后一个表达式显然是方括号中项的离散傅里叶变换。因此,评估给定 l' 的 FT 会为您提供 中所有 j 的术语。因此,要计算 ,请评估所有 l' 的 FT,然后在第一个等式中求和,这只是一个矩阵向量乘法。SjlAj

您可以通过利用 mod 功能进一步改进这一点,这意味着实际上只有 R 独立的 FT 您需要评估,因为对于更高的 l' 术语只会重复。

如果我有这个权利,这将减少从的操作数量,假设傅里叶变换部分支配矩阵向量乘法。O(NL×K2)O(R×K×log(K))