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