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= r11r21r31r41r21r22r32r31r31r32r22r21r41r31r21r11
​ 在针对此复数矩阵的特征分解计算中可以将其转化为实对称矩阵再进行计算
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} [RrRiRiRr][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仿真验证

  1. 首先构建Hermitian 矩阵

在这里插入图片描述

图1. 构建Hermitian矩阵
  1. 构建实对称矩阵

在这里插入图片描述

图2. 构建实对称矩阵
  1. 对实对称矩阵进行Jacobi特征分解

在这里插入图片描述

图3. 实对称矩阵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
  1. 观察特征值对角矩阵可得,每个特征值都有2重,所以取一半特征值,同时根据

X = [ U V ] \mathbf{X}=\begin{bmatrix} \mathbf{U} \\ \mathbf{V} \end{bmatrix} X=[UV]

重新组合特征向量,可得

在这里插入图片描述

图4. 重新组合特征值、特征向量
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
  1. 使用eig函数进行比对

在这里插入图片描述

图5. 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

在这里插入图片描述

图6. 特征向量验证

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=[100apqaˉpq]=[100bpq2+cpq2 bpqicpq]=[100ejφ].

在上式 中, φ = 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 ejφ=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+cpq2 bpq,sinφ=bpq2+cpq2 cpq.

因而通过西对角化, 有

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=[appapqapqaqq]=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)} ejφ(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θ=1tan2θ2tanθ=app(k)aqq(k)2apq(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验证

在这里插入图片描述

图7. 法2 Matlab验证

3. 参考文献


  1. 曾富红,司伟建,曲志昱.基于Hermitian矩阵的特征分解算法[J].沈阳大学学报(自然科学版),2016,28(06):512-517. ↩︎

  2. 征道生.Hermite矩阵特征值问题的2阶主子阵实数化法[J].华东师范大学学报(自然科学版),1996(03):1-6. ↩︎

  • 31
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值