快速Fourier变换(FFT)在Toeplitz矩阵向量乘法中的应用
题目描述
Toeplitz矩阵是一种每个对角线元素恒定的特殊矩阵,其形式如下:
\[T = \begin{bmatrix} t_0 & t_{-1} & t_{-2} & \cdots & t_{-(n-1)} \\ t_1 & t_0 & t_{-1} & \ddots & \vdots \\ t_2 & t_1 & \ddots & \ddots & t_{-2} \\ \vdots & \ddots & \ddots & t_0 & t_{-1} \\ t_{n-1} & \cdots & t_2 & t_1 & t_0 \end{bmatrix} \]
当矩阵规模 \(n\) 很大时,直接计算 Toeplitz 矩阵 \(T\) 与向量 \(x\) 的乘法(即 \(y = Tx\))需要 \(O(n^2)\) 次运算。本题要求利用快速傅里叶变换(FFT)将计算复杂度降至 \(O(n \log n)\)。
解题过程
步骤1: 将Toeplitz矩阵嵌入循环矩阵
Toeplitz矩阵本身不是循环矩阵,但可以通过嵌入到一个更大的循环矩阵中来利用FFT。具体方法:
- 构造一个 \(2n \times 2n\) 的循环矩阵 \(C\),其第一行为:
\[ [t_0, t_{-1}, \dots, t_{-(n-1)}, 0, t_{n-1}, t_{n-2}, \dots, t_1] \]
即保留 \(T\) 的第一行和第一列的元素,中间补零(见示例)。
2. 例如当 \(n=3\) 时,循环矩阵 \(C\) 的第一行为:
\[ [t_0, t_{-1}, t_{-2}, 0, t_2, t_1] \]
- 将向量 \(x\) 补零扩展为 \(2n\) 维向量 \(\tilde{x} = [x_1, x_2, \dots, x_n, 0, \dots, 0]^\top\)。
原理:循环矩阵可由其第一行通过循环移位生成,且循环矩阵的乘法可通过FFT快速计算。
步骤2: 循环矩阵的FFT对角化
任意循环矩阵 \(C\) 可被傅里叶矩阵 \(F\) 对角化:
\[C = F^{-1} \operatorname{diag}(\lambda) F \]
其中:
- \(F\) 是 \(2n \times 2n\) 的傅里叶矩阵,满足 \(F_{jk} = \omega^{jk} / \sqrt{2n}\)(\(\omega = e^{-2\pi i / 2n}\))。
- \(\lambda\) 是 \(C\) 的第一行经过FFT得到的特征值向量: \(\lambda = \operatorname{FFT}(c)\),\(c\) 为 \(C\) 的第一行。
因此,循环矩阵与向量的乘法可转化为:
\[C\tilde{x} = F^{-1} \left( \lambda \odot (F \tilde{x}) \right) \]
其中 \(\odot\) 表示逐元素乘法。
步骤3: 利用FFT加速计算
- 计算 \(F \tilde{x}\):对 \(\tilde{x}\) 做FFT,复杂度 \(O(n \log n)\)。
- 计算 \(F c\):对 \(C\) 的第一行 \(c\) 做FFT,得到 \(\lambda\),复杂度 \(O(n \log n)\)。
- 逐元素相乘:\(\lambda \odot (F \tilde{x})\),复杂度 \(O(n)\)。
- 对结果做逆FFT:\(F^{-1}(\cdot)\),复杂度 \(O(n \log n)\)。
总复杂度为 \(O(n \log n)\)。
步骤4: 提取Toeplitz矩阵的乘法结果
循环矩阵乘法 \(C\tilde{x}\) 的结果是一个 \(2n\) 维向量,但其前 \(n\) 个元素恰好等于 \(Tx\):
\[y = \text{前 } n \text{ 个元素 of } C\tilde{x} \]
这是因为 \(C\) 的构造保证了其左上 \(n \times n\) 块为原始Toeplitz矩阵 \(T\),且补零后的 \(\tilde{x}\) 不影响前 \(n\) 个结果。
示例验证(n=2)
设 \(T = \begin{bmatrix} a & b \\ c & a \end{bmatrix}\),向量 \(x = [x_1, x_2]^\top\)。
- 构造 \(C\) 的第一行: \([a, b, 0, c]\)。
- 扩展 \(\tilde{x} = [x_1, x_2, 0, 0]^\top\)。
- 通过FFT计算 \(C\tilde{x}\),前两个元素为 \(ax_1 + bx_2\) 和 \(cx_1 + ax_2\),与 \(Tx\) 一致。
关键点总结
- 核心思想:通过嵌入技术将Toeplitz矩阵转化为循环矩阵。
- FFT的作用:利用循环矩阵的傅里叶对角化性质,将矩阵乘法转化为三次FFT和一次点乘。
- 适用场景:大规模Toeplitz矩阵的快速乘法,尤其在信号处理、数值偏微分方程中常见。