伪逆矩阵 的使用

伪逆矩阵(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

猜你喜欢

转载自blog.csdn.net/weixin_39354845/article/details/128808326
今日推荐