循环矩阵傅里叶对角化

All circulant matrices are made diagonal by the Discrete Fourier Transform (DFT), regardless of the generating vector x.
任意循环矩阵可以被傅里叶变换矩阵对角化。

文献中,一般用如下方式表达这一概念:

X=C(x)=Fdiag(x ^ )F H  

其中 X  是循环矩阵, x ^   是原向量 x  的傅里叶变换, F  是傅里叶变换矩阵,上标H表示共轭转置: X H =(X  ) T  
换句话说, X  相似于对角阵, X  的特征值是 x ^   的元素。

另一方面,如果一个矩阵能够表示成两个傅里叶矩阵夹一个对角阵的乘积形式,则它是一个循环矩阵。其生成向量是对角元素的傅里叶逆变换:

Fdiag(y)F H =C(F 1 (y)) 

这个公式初看疑问很多,以下一一讨论。

X  是什么?

X  是由原向量 x  生成的循环矩阵。以矩阵尺寸 K=4  为例。

X=C(x)=⎡ ⎣ ⎢ ⎢ ⎢ x 1 x 4 x 3 x 2  x 2 x 1 x 4 x 3  x 3 x 2 x 1 x 4  x 4 x 3 x 2 x 1  ⎤ ⎦ ⎥ ⎥ ⎥  

F  是什么?

F  是离散傅里叶矩阵(DFT matrix),可以用一个复数 ω=e 2πi/K   表示,其中 K  为方阵 F  的尺寸。以 K=4  为例。

F=1K − −    ⎡ ⎣ ⎢ ⎢ ⎢ ⎢ 1111 1ωω 2 ω 3  1ω 2 ω 4 ω 6  1ω 3 ω 6 ω 9  ⎤ ⎦ ⎥ ⎥ ⎥ ⎥  

ω  想象成一个角度为 2π/K  的向量,这个矩阵的每一行是这个向量在不断旋转。从上到下,旋转速度越来越快。

之所以称为DFT matrix,是因为一个信号的DFT变换可以用此矩阵的乘积获得:

x ^ =DFT(x)=K − −   Fx 

反傅里叶变换也可以通过类似手段得到:

x=1K − −    F 1 x ^  

傅里叶矩阵有许多性质:
- 是对称矩阵,观察 ω  的规律即可知;
- 满足 F H F=FF H =I  ,也就是说它是个酉矩阵(unitary)。可以通过将 F H   展开成 ω H   验证。

注意: F  是常数,可以提前计算好,和要处理的 x  无关。

对角化怎么理解?

把原公式两边乘以逆矩阵:

F 1 X(F H ) 1 =diag(x ^ ) 

利用前述酉矩阵性质:
=F H XF=diag(x ^ ) 

也就是说,矩阵 X  通过相似变换 F  变成对角阵 diag(x ^ )  ,即对循环矩阵 X  进行对角化。
另外, F H XF  是矩阵 X  的2D DFT变换。即傅里叶变换可以把循环矩阵对角化。

怎么证明?

可以用构造特征值和特征向量的方法证明(参看这篇论文1的3.1节),此处简单描述。
考察待证明等式的第k列:

Xf k =x ^  k f k  

其中 f k   表示DFT矩阵的第k列, x ^  k   表示傅里叶变换的第k个元素。等价于求证: f k   x ^  k   X  的一对特征向量和特征值。

左边向量的第i个元素为: left i =[x i ,f k ]  x i   表示把生成向量 x  向右移动i位, []  表示内积。
内积只和两个向量的相对位移有关,所以可以把 f k   向左移动i位: left i =[x,f i k ] 
DFT矩阵列的移位可以通过数乘 ω  的幂实现: f i k =f 0 ω ik  

举例: K=3 

F=1K − −    ⎡ ⎣ ⎢ 111 1ωω 2  1ω 2 ω 4  ⎤ ⎦ ⎥  

利用 ω N =1  .

f 1 ω=[1,ω,ω 2 ]ω=[ω,ω 2 ,ω 3 ]=[ω,ω 2 ,1]=f 1 1  

f 1 ω 2 =[1,ω,ω 2 ]ω 2 =[ω 2 ,ω 3 ,ω 4 ]=[ω 2 ,1,ω]=f 2 1  

于是有:

left i =[x,f k ω ik ]=[x,f k ]ω ik  

右边的 x ^ =Fx  ,考虑到 F  的第k行和第k列相同, x ^  k =[f k ,x]  。另外 f k   的第i个元素为 ω ik  

right i =x ^  k f ki =[f  k ,x]ω ki  

对任意k列的第i个元素有: left i =right i  

更多性质

利用对角化,能推导出循环矩阵的许多性质。

转置

循环矩阵的转置也是一个循环矩阵(可以查看循环矩阵各元素排列证明),其特征值和原特征值共轭。

X T =Fdiag((x ^ )  )F H  

可以通过如下方式证明:
X T =(F H ) T diag(x ^ )F T  

由于 F  是对称酉矩阵,且已知 X  是实矩阵:
X T =F  diag(x ^ )F=(F  diag(x ^ )F)  =Fdiag((x ^ )  )F H  

如果原生成向量 x  是对称向量(例如[1,2,3,4,3,2]),则其傅里叶变换为实数,则:

X T =C(F 1 (x ^ )  )=C(x) 

卷积

循环矩阵乘向量等价于生成向量的逆序和该向量卷积,可进一步转化为福利也变化相乘。
注意卷积本身即包含逆序操作,另外利用了信号与系统中经典的“时域卷积,频域相乘”。

F(Xy)=F(C(x)y)=F(x ¯ y)=F  (x)F(y) 

其中 x ¯   表示把 x  的元素倒序排列。星号表示共轭。

相乘

C,B  为循环矩阵,其乘积的特征值等于特征值的乘积:

AB=Fdiag(a ^ )F H Fdiag(b ^ )F H  

=Fdiag(a ^ )diag(b ^ )F H =Fdiag(a ^ b ^ )F H  

=C(F 1 (a ^ b ^ )) 

乘积也是循环矩阵,其生成向量是原生成向量对位相乘的傅里叶逆变换。

相加

和的特征值等于特征值的和:

A+B=Fdiag(a ^ )F H +Fdiag(b ^ )F H =Fdiag(a ^ +b ^ )F H  

=C(F 1 (a ^ +b ^ ))=C(F 1 (a ^ )+F 1 (b ^ ))=C(a+b) 

和也是循环矩阵,其生成向量是原生成向量的和。

求逆

循环矩阵的逆,等价于将其特征值求逆。

X 1 =Fdiag(x ^ ) 1 F H =C(F 1 (diag(x ^ ) 1 )) 

对角阵求逆等价于对角元素求逆。以下证明:
Fdiag(x ^ ) 1 F H Fdiag(x ^ )F H  

=Fdiag(x ^ ) 1 diag(x ^ )F H =FF H =I 

逆也是循环矩阵

有什么用?

该性质可以将循环矩阵的许多运算转换成更简单的运算。例如:

X H X=Fdiag(x ^ x ^   )F H =C(F 1 (x ^ x ^   )) 

原始计算量:两个方阵相乘( O(K 3 ) 
转化后的计算量:反向傅里叶( KlogK  )+向量点乘( K  )。

CV的许多算法中,都利用了这些性质提高运算速度,例如2015年TPAMI的这篇高速跟踪KCF方法2。

二维情况

以上探讨的都是原始信号为一维的情况。以下证明二维情况下的 F H XF=diag(x ^ )  ,推导方法和一维类似。

x  是二维生成矩阵,尺寸 N×N 
X  是一个 N 2 ×N 2   的分块循环矩阵,其uv块记为 x uv   ,表示 x  下移u行,右移v列。
F  N 2 ×N 2   的二维DFT矩阵,其第uv块记为 f uv ={ω ui+vj } ij  

举例:N=3

f 01 =⎡ ⎣ ⎢ 111 ωωω ω 2 ω 2 ω 2  ⎤ ⎦ ⎥ ,f 11 =⎡ ⎣ ⎢ 1ωω 2  ωω 2 ω 3  ω 2 ω 3 ω 4  ⎤ ⎦ ⎥  

需要验证的共有 N×N  个等式,其中第 uv  个为:

[X,f uv ]=x ^  uv f uv  

其中 [X,f uv ]  表示把 x uv   分别和 f uv   做点乘,结果矩阵元素求和。
这个等式的第ij元素为:
[x ij ,f uv ]=x ^  uv ω ui+vj  

再次利用两个性质:1) 点乘只和两个矩阵相对位移有关,2) f uv   的位移可以用乘 ω  幂实现:

left ij =[x,f ij uv ]=[x,f uv ]ω ui+vj =x ^  uv ω ui+vj =right ij  

代码

以下matlab代码验证上述性质。需要注意的是,matlab中的dftmatx函数给出的结果和本文定义略有不同,需做一简单转换。另外,matlab中的撇号表示共轭转置,transpose为转置函数,conj为共轭函数。

clear;clc;close all;

% 1. diagnolize 
K = 5;      % dimension of problem

x_base = rand(1,K);     % generator vector
X = zeros(K,K);         % circulant matrix
for k=1:K
    X(k,:) = circshift(x_base, [0 k-1]);
end

x_hat = fft(x_base);    % DFT

F = transpose(dftmtx(K))/sqrt(K);       % the " ' " in matlab is transpose + conjugation

X2 = F*diag(x_hat)*F';

display(X);
display(real(X2));

% 2. fast compute correlation
C = X'*X;
C2 = (x_hat.*conj(x_hat))*conj(F)/sqrt(K);

display(C);
display(C2);

  1. Gray, Robert M. Toeplitz and circulant matrices: A review. now publishers inc, 2006. ↩
  2. Henriques, João F., et al. “High-speed tracking with kernelized correlation filters.” Pattern Analysis and Machine Intelligence, IEEE Transactions on 37.3 (2015): 583-596. ↩

你可能感兴趣的:(数学,循环矩阵,傅里叶变换,对角化,快速计算)