伪逆矩阵(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     9
     9     0     9
     1     2     1
     9     5     9
>> b=inv(a'*a)*a'  % b 是直接计算得到的违逆矩阵
b =
   -1.0000   -0.0751    0.4325    1.0270
   -0.0000   -0.1680    0.1108    0.1557
    1.0000    0.1787   -0.4583   -1.0167
>> b*a
ans =
    1.0000    0.0000    0.0000
    0.0000    1.0000   -0.0000
    0.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.3587
S =
   22.6608         0         0
         0    4.7187         0
         0         0    0.4693
         0         0         0
V =
   -0.6625    0.2588   -0.7029
   -0.2953   -0.9526   -0.0724
   -0.6884    0.1596    0.7076
>> T=S
T =
   22.6608         0         0
         0    4.7187         0
         0         0    0.4693
         0         0         0
>> T(find(S~=0)) = 1./S(find(S~=0))%将S对角矩阵中的非零元素取其倒数
T =
    0.0441         0         0
         0    0.2119         0
         0         0    2.1309
         0         0         0
>> svdInvA = V * T' * U'   %计算结果
svdInvA =
   -1.0000   -0.0751    0.4325    1.0270
    0.0000   -0.1680    0.1108    0.1557
    1.0000    0.1787   -0.4583   -1.0167
>> a*svdInvA
ans =
    1.0000   -0.0000    0.0000    0.0000
         0    0.9329   -0.2323    0.0929
    0.0000   -0.2323    0.1958    0.3217
         0    0.0929    0.3217    0.8713


















