Hermitian矩阵特征分解
1. Hermitian 矩阵实对称化
Hermitian 矩阵是复数方阵,
R
=
(
r
i
j
)
R=(r _ { i j } )
R=(rij)满足
R
=
R
H
R = R^H
R=RH,其中
R
H
R^H
RH表示共轭转置,相当于
r
i
j
=
r
j
i
∗
r_{i\:j}=r_{j\:i}^*
rij=rji∗ ,例如对于一个四阶矩阵应满足:
R
=
[
r
11
r
21
∗
r
31
∗
r
41
∗
r
21
r
22
r
32
∗
r
31
∗
r
31
r
32
r
22
r
21
∗
r
41
r
31
r
21
r
11
]
R=\begin{bmatrix}r_{11}&r_{21}^*&r_{31}^*&r_{41}^*\\r_{21}&r_{22}&r_{32}^*&r_{31}^*\\r_{31}&r_{32}&r_{22}&r_{21}^*\\r_{41}&r_{31}&r_{21}&r_{11}\end{bmatrix}
R=
r11r21r31r41r21∗r22r32r31r31∗r32∗r22r21r41∗r31∗r21∗r11
在针对此复数矩阵的特征分解计算中可以将其转化为实对称矩阵再进行计算
R
X
=
λ
X
\mathbf{R} \mathbf{X} = \lambda \mathbf{X}
RX=λX
其中
X
\mathbf{X}
X 是协方差矩阵的特征向量,
λ
\lambda
λ 是协方差矩阵的特征值。将
R
\mathbf{R}
R 和
X
\mathbf{X}
X 以实部和虚部的形式表示:
R
=
R
r
+
i
R
i
X
=
U
+
i
V
\mathbf{R} = \mathbf{R _ { r }} +i\mathbf{R _ { i }} \\ \mathbf{X} = \mathbf{U} + i\mathbf{V}
R=Rr+iRiX=U+iV
将上式表达成矩阵形式为:
[
R
r
−
R
i
R
i
R
r
]
[
U
V
]
=
λ
[
U
V
]
\begin{bmatrix} \mathbf{R}_r & -\mathbf{R}_i \\\mathbf{R}_i & \mathbf{R}_r\end{bmatrix}\begin{bmatrix}\mathbf{U} \\\mathbf{V}\end{bmatrix}= \lambda\begin{bmatrix}\mathbf{U} \\\mathbf{V}\end{bmatrix}
[RrRi−RiRr][UV]=λ[UV]
将
M
×
M
M\times M
M×M 阶的复 Hermitian 矩阵
R
\mathbf{R}
R 的特征值分解等价于求解由实矩阵
R
r
\mathbf{R}_r
Rr、
R
i
\mathbf{R}_i
Ri 组成的
2
M
×
2
M
2M\times 2M
2M×2M 阶分块矩阵
R
′
\mathbf{R'}
R′ 的特征值分解。
Matlab仿真验证
- 首先构建Hermitian 矩阵
- 构建实对称矩阵
- 对实对称矩阵进行Jacobi特征分解
function [V,D,iter]=Jacobi_classical(A,maxIter,tol)
n = size(A, 1); % 矩阵的大小
V = eye(n); % 初始化特征向量矩阵为单位矩阵
iter = 0; % 初始化迭代次数
% 设置最大迭代次数和误差精度
if nargin < 3 || isempty(tol)
tol = 1e-9; % 默认误差精度
end
if nargin < 2 || isempty(maxIter)
maxIter = 1000; % 默认最大迭代次数
end
while(iter < maxIter)
iter=iter+1;
D=A;
n=size(D,1);
p=1;q=2;
for i=1:n
for j=i+1:n
if(abs(D(i,j))>abs(D(p,q)))%找到对称矩阵的上三角矩阵中最大的元素的下标
p=i;q=j;
end
end
end
if(abs(D(p,q))<tol)
break;
end
if(A(p,q)~=0)
d=(A(q,q)-A(p,p))/(2*A(p,q));
if(d>0)
t=1/(d+sqrt(d^2+1));
else
t=-1/(-d+sqrt(d^2+1));
end
c=1/sqrt(t^2+1);s=c*t;
else
c=1;s=0;
end
R=[c s;-s c];
A([p,q],:)=R'*A([p,q],:);
A(:,[p,q])=A(:,[p,q])*R;
V(:, [p, q]) = V(:,[p,q])*R;
end
- 观察特征值对角矩阵可得,每个特征值都有2重,所以取一半特征值,同时根据
X = [ U V ] \mathbf{X}=\begin{bmatrix} \mathbf{U} \\ \mathbf{V} \end{bmatrix} X=[UV]
重新组合特征向量,可得
R=[real(Rxx),-imag(Rxx);imag(Rxx),real(Rxx);];%化为实对称矩阵
[VV,DD,iter]=Jocobi_classical(R);%求特征值、特征向量
EV=VV(1:M, 1:M)+1j*VV(M+1:2*M,1:M);D=DD(1:M, 1:M);%重新组合为复数特征向量X
- 使用eig函数进行比对
由于特征向量不唯一,可根据定义 R X = λ X \mathbf{R} \mathbf{X} = \lambda \mathbf{X} RX=λX验证,验证代码如下
function verificationResult = verifyEigen(A, D, V)
% verifyEigen 函数验证给定的矩阵 A 的特征值和特征向量
% 输入:
% A - 原始矩阵
% D - 特征值矩阵,对角线上是特征值,其他元素为0
% V - 特征向量矩阵,每一列是对应的特征向量
% 输出:
% verificationResult - 逻辑值,true 如果所有特征值和特征向量验证通过,否则为 false
n = size(A, 1); % 获取矩阵 A 的大小
verificationResult = true; % 初始化验证结果为 true
% 检查 V 的列是否为 A 的特征向量
for i = 1:n
% 取出第 i 个特征值和对应的特征向量
lambda = D(i,i);
eigenvector = V(:,i);
% 计算 A * eigenvector
Av = A * eigenvector;
% 计算 lambda * eigenvector
lambda_v = lambda * eigenvector;
% 检查 A * eigenvector 是否等于 lambda * eigenvector
% 使用 norm 函数和 inf 范数来检查两个向量的差是否在容忍误差内
tolerance = 1e-10; % 设置一个容忍误差
if norm(Av - lambda_v, inf) > tolerance
verificationResult = false; % 如果不等,则验证失败
fprintf('验证失败:特征值 %f 的特征向量\n', lambda);
break; % 跳出循环
end
end
% 输出最终验证结果
if verificationResult
disp('所有特征值和特征向量验证成功。');
else
disp('存在不满足特征值和特征向量条件的案例。');
end
end
2. 二阶主子阵实数化法与Jacobi方法
上一种方法将 M × M M\times M M×M 阶的复 Hermitian 矩阵 R \mathbf{R} R 的特征值分解等价于求解由实矩阵 R r \mathbf{R}_r Rr、 R i \mathbf{R}_i Ri 组成的 2 M × 2 M 2M\times 2M 2M×2M 阶分块矩阵 R ′ \mathbf{R'} R′ 的特征值分解,提高了阶数也就提高了计算时间,以下方法是变换过程中将元素实数化再应用Jacobi方法求解1。
将二阶主子阵实数化法2与 Jacobi 方法相结合,算法的主要思想是在每个迭代中,将矩阵的一个二阶主子阵用酉对角阵相似变换成二阶的实对称矩阵,然后再利用 Jacobi 方法将此二阶实对称矩阵对角化。通过不断循环,不断选取不同的二阶主子阵,应用 Jacobi 方法进行对角化,直到整个矩阵最终近似为对角阵。
首先用酉对角阵相似变换变换成二阶的实对称矩阵,设在 Hermitian 矩阵 A = B + i C \mathbf{A} = \mathbf{B} + i\mathbf{C} A=B+iC 中, a p q = b p q + i c p q ≠ 0 , ( p < q ) a_{pq} =b_{pq} + ic_{pq} {\neq} 0,(p < q) apq=bpq+icpq=0,(p<q) , 则接下来讨论二阶主子阵的西对角化过程,
A p q = [ a p p a p q a q p a q q ] = [ b p p b p q b q p b q q ] + i [ c p p c p q c q p c q q ] = B p q + i C p q . {\mathbf{A}}_{pq} = \left\lbrack \begin{array}{ll} a_{pp} & a_{pq} \\ a_{qp} & a_{qq} \end{array} \right\rbrack = \left\lbrack \begin{array}{ll} b_{pp} & b_{pq} \\ b_{qp} & b_{qq} \end{array} \right\rbrack + i\left\lbrack \begin{array}{ll} c_{pp} & c_{pq} \\ c_{qp} & c_{qq} \end{array} \right\rbrack ={\mathbf{B}}_{pq} + i{\mathbf{C}}_{pq}\text{.} Apq=[appaqpapqaqq]=[bppbqpbpqbqq]+i[cppcqpcpqcqq]=Bpq+iCpq.
根据反对角线上的元素作西对角阵, 有
T p q = [ 1 0 0 a ˉ p q ∣ a p q ∣ ] = [ 1 0 0 b p q − i c p q b p q 2 + c p q 2 ] = [ 1 0 0 e − j φ ] . {\mathbf{T}}_{pq} = \begin{bmatrix} 1 & 0 \\ 0 & \frac{{\bar{a}}_{pq}}{\left| a_{pq} \right|} \end{bmatrix} = \begin{bmatrix} 1 & 0 \\ 0 & \frac{b_{pq} {-} ic_{pq}}{\sqrt{b_{pq}^{2} + c_{pq}^{2}}} \end{bmatrix} =\begin{bmatrix} 1 & 0 \\ 0 & {\mathrm{e}}^{{-}j\varphi} \end{bmatrix}. Tpq=[100∣apq∣aˉpq]=[100bpq2+cpq2bpq−icpq]=[100e−jφ].
在上式 中, φ = angle ( a p q ) \varphi = \operatorname{angle}\left( a_{pq} \right) φ=angle(apq) , 其中 e − j φ = cos φ − j sin φ {\mathrm{e}}^{{-}j\varphi} = \cos\varphi {-}j\sin\varphi e−jφ=cosφ−jsinφ , 故有
cos φ = b p q b p q 2 + c p q 2 , sin φ = c p q b p q 2 + c p q 2 . \cos\varphi = \frac{b_{pq}}{\sqrt{b_{pq}^{2} + c_{pq}^{2}}},\sin\varphi = \frac{c_{pq}}{\sqrt{b_{pq}^{2} + c_{pq}^{2}}}. cosφ=bpq2+cpq2bpq,sinφ=bpq2+cpq2cpq.
因而通过西对角化, 有
A
p
q
(
1
)
=
T
p
q
H
A
p
q
T
p
q
=
[
a
p
p
∣
a
p
q
∣
∣
a
p
q
∣
a
q
q
]
=
B
p
q
(
1
)
.
{\mathbf{A}}_{pq}^{(1)} = {\mathbf{T}}_{pq}^{H}{\mathbf{A}}_{pq}{\mathbf{T}}_{pq} = \begin{bmatrix} a_{pp} & \left| a_{pq} \right| \\ \left| a_{pq} \right| & a_{qq} \end{bmatrix} = {\mathbf{B}}_{pq}^{(1)}.
Apq(1)=TpqHApqTpq=[app∣apq∣∣apq∣aqq]=Bpq(1).
通过得到的
B
p
q
(
1
)
{\mathbf{B}}_{pq}^{(1)}
Bpq(1) 为二阶实对称矩阵. 然后再将其通过 Jacobi 旋转变换之后得到对角阵. 在本特征分解算法中, 使用的平面旋转矩阵的模型为
J p q = [ cos θ − sin θ sin θ cos θ ] , {\mathbf{J}}_{pq} = \begin{bmatrix} \cos\theta & {-} \sin\theta \\ \sin\theta & \cos\theta \end{bmatrix}, Jpq=[cosθsinθ−sinθcosθ],
则有
B p q ( 2 ) = J p q T B p q ( 1 ) J p q = [ a p p ( 2 ) 0 0 a q q ( 2 ) ] . {\mathbf{B}}_{pq}^{(2)} = {\mathbf{J}}_{pq}^{T}{\mathbf{B}}_{pq}^{(1)}{\mathbf{J}}_{pq} = \begin{bmatrix} a_{pp}^{(2)} & 0 \\ 0 & a_{qq}^{(2)} \end{bmatrix}. Bpq(2)=JpqTBpq(1)Jpq=[app(2)00aqq(2)].
式 中,
B
p
q
(
2
)
{\mathbf{B}}_{pq}^{(2)}
Bpq(2) 为对角阵.通过分析可得,
T
p
q
H
A
T
p
q
{\mathbf{T}}_{pq}^{H}{\mathbf{A}}{\mathbf{T}}_{pq}
TpqHATpq 会改变
A
\mathbf{A}
A 的
q
q
q 行
q
q
q 列
e
−
j
φ
∗
(
A
)
k
q
→
(
A
′
)
{\mathrm{e}}^{{-}j\varphi}*{\left( \mathbf{A} \right)}_{kq} {\rightarrow} {\left( \mathbf{A}' \right)}
e−jφ∗(A)kq→(A′)
e j φ ∗ ( A ′ ) q k → ( A ′ ′ ) {\mathrm{e}}^{j\varphi}*{\left( \mathbf{A}' \right)}_{qk} {\rightarrow} {\left( \mathbf{A}'' \right)} ejφ∗(A′)qk→(A′′)
这样
A
′
′
\mathbf{A}''
A′′ 就部分实数化了再进行后续的 Givens 变换,其中旋转矩阵中的
θ
\theta
θ 满足下式:
tan
2
θ
=
2
tan
θ
1
−
tan
2
θ
=
2
∣
a
p
q
(
k
)
∣
a
p
p
(
k
)
−
a
q
q
(
k
)
.
\tan2\theta =\frac{2\tan\theta}{1-\tan^2\theta}=\frac{2\mid a_{pq}^{(k)}\mid}{a_{pp}^{(k)}-a_{qq}^{(k)}}.
tan2θ=1−tan2θ2tanθ=app(k)−aqq(k)2∣apq(k)∣.
通过不断迭代就可以对角化得到特征值,记录迭代过程的旋转矩阵就可以得到特征向量
实现代码如下:
function [V,D,iter]=Jacobi_Hermitian(A,maxIter,tol)
%厄米特矩阵实数化后jacobi迭代求解
n = size(A, 1); % 矩阵的大小
V = eye(n); % 初始化特征向量矩阵为单位矩阵
iter = 0; % 初始化迭代次数
% 设置最大迭代次数和误差精度
if nargin < 3 || isempty(tol)
tol = 1e-9; % 默认误差精度
end
if nargin < 2 || isempty(maxIter)
maxIter = 1000; % 默认最大迭代次数
end
while(iter < maxIter)
iter=iter+1;
D=A;
p=1;q=2;
for i=1:n
for j=i+1:n
if(abs(A(i,j))>abs(A(p,q)))%找到对称矩阵的上三角矩阵中最大的元素的下标
p=i;q=j;
end
end
end
if(abs(D(p,q))<tol)
break;
end
phi=angle(A(p,q));%实数化角度
A(:,q)=exp(-1i*phi).*A(:,q);%实数化涉及到的列变换
A(q,:)=exp(1i*phi).*A(q,:);%实数化涉及到的行变换
V(:,q)=exp(-1i*phi).*V(:,q);%记录变换矩阵
theta=0.5*atan(2*abs(A(p,q))/(A(p,p)-A(q,q)));%Givens变换角度
c=cos(theta);s=sin(theta);
R=[c s;-s c];
A([p,q],:)=R*A([p,q],:);%Givens变换涉及到的行变换
A(:,[p,q])=A(:,[p,q])*R';%Givens变换涉及到的列变换
V(:,[p,q])=V(:,[p,q])*R';%记录变换矩阵
end
Matlab验证