伪逆矩阵(pseudo-inverse)_Uglyduckling911的博客-CSDN博客_伪逆矩阵
一、什么是伪逆矩阵
若任意矩阵Am*n,B 为A的广义逆矩阵,若B满足下述条件(Moore-penrose条件):
(1)BAB = B;
(2)ABA = A;
(3)AB为hermitian矩阵,即(AB)^H=AB;
(4)BA为hermitian矩阵,即(BA)^H=BA;
二、伪逆矩阵的求法
① 直接求解:
求导,令导数为0,结果如下: InvA=(ATA)-1AT
% 直接求伪逆
InvA = inv(A'*A)*A';
② SVD求解
%% SVD分解求伪逆
% 原理和公式:1. SVD分解得到的矩阵:U和V是正交阵,S是对角阵
% 2. 正交阵的逆=转置
% 3. 对角阵的逆=非零元素求倒
% Step1: 求解A的SVD分解
[U,S,V] = svd(A); % A = U*S*V'
% Step2: 将S中的非零元素求倒
T=S;
T(find(S~=0)) = 1./S(find(S~=0));
% Step3: 求invA
svdInvA = V * T' * U';
③ QR求解
%% QR分解求伪逆
% 适用于稀疏矩阵
% 原理和公式:1. QR分解得到的矩阵:Q是正交阵,R是非奇异上三角阵
% 2. 正交阵的逆=转置
% 3. 上(下)三角矩阵的逆也仍然是上(下)三角矩阵。不必用高斯消去法,向前替换法解方程。
% 但是具体的我不知道怎么用程序来写,这里仍旧用了matlab的函数。
[Q,R] = qr(A);
InvR = inv(R'*R)*R';
qrInvA =InvR*Q';
三、 伪逆矩阵与SVD的关系
四、案例使用
1、直接求解
>> a=floor(10*rand(4,3))a =8 6 99 0 91 2 19 5 9>> b=inv(a'*a)*a' % b 是直接计算得到的违逆矩阵b =-1.0000 -0.0751 0.4325 1.0270-0.0000 -0.1680 0.1108 0.15571.0000 0.1787 -0.4583 -1.0167>> b*aans =1.0000 0.0000 0.00000.0000 1.0000 -0.00000.0000 0.0000 1.0000>> b=inv(a’*a)*a’
2、使用svd分解 这个我用上面得到的svd 分解达到的结果是错的,不知道为啥
>> [U,S,V]=svd(a) % a 矩阵svd 分解U =-0.5855 -0.4681 0.6619 0.0000-0.5365 0.7981 0.0898 -0.2591-0.0857 -0.3151 -0.2986 -0.8968-0.6017 -0.2113 -0.6816 0.3587S =22.6608 0 00 4.7187 00 0 0.46930 0 0V =-0.6625 0.2588 -0.7029-0.2953 -0.9526 -0.0724-0.6884 0.1596 0.7076>> T=ST =22.6608 0 00 4.7187 00 0 0.46930 0 0>> T(find(S~=0)) = 1./S(find(S~=0))%将S对角矩阵中的非零元素取其倒数T =0.0441 0 00 0.2119 00 0 2.13090 0 0>> svdInvA = V * T' * U' %计算结果svdInvA =-1.0000 -0.0751 0.4325 1.02700.0000 -0.1680 0.1108 0.15571.0000 0.1787 -0.4583 -1.0167>> a*svdInvAans =1.0000 -0.0000 0.0000 0.00000 0.9329 -0.2323 0.09290.0000 -0.2323 0.1958 0.32170 0.0929 0.3217 0.8713