线性代数 · 矩阵 · Matlab | Moore-Penrose 伪逆矩阵代码实现

发布时间 2023-11-11 12:06:07作者: MoonOut

背景 - Moore-Penrose 伪逆矩阵:

  • 对任意矩阵 \(A\in\mathbb C^{m\times n}\) ,其 Moore-Penrose 逆矩阵 \(A^+\in\mathbb C^{n\times m}\) 存在且唯一。
    • 定义:若矩阵 G 满足 \(AGA=A,~ GAG=G,~ (AG)^H=AG,~ (GA)^H=GA\) ,则 G 是 Moore-Penrose 逆矩阵,可以记作 \(A^+\)
    • 性质:\(A^+\) 满足 \(A^{++}=A,~ A^{H+}=A^{+H},\) \(\mathrm{rank}(A^+)=\mathrm{rank}(A),\) \(\mathrm{Range/Null}(A^+)=\mathrm{Range/Null}(A^H)\)
  • \(A^+\) 求解方法 1(迹方法):
    • \(A_{m\times n}\) 的秩为 r。
    • 计算 \(B=A^TA\)
    • \(C_1=I_{n\times n}\)
    • for i = 2 to r-1,计算 \(C_{i+1}=(1/i)\mathrm{tr}(C_iB)I-C_iB\)
    • 得到 \(A^+=\frac{r}{\mathrm{tr}(C_rB)}C^rA^T\)
  • \(A^+\) 求解方法 2(满秩分解法):
    • 若 A=FG 是满秩分解,则 \(A^+=G^H(F^HAG^H)^{-1}F^H\)

代码 0(matlab 内置函数):直接使用 pinv() 函数。

代码 1(满秩分解法):(fullrank_decompose 代码见 代码存档

function [B] = moore_penrose_pinv(A)
% using full rank decomposition

[m,n] = size(A);

[F,G] = fullrank_decompose(A);
B = G'*(F'*A*G')^(-1)*F';

end

代码 2(迹方法):

function [X] = moore_penrose_pinv2(A)
% using trace method

[m,n] = size(A);
r = rank(A);

B = A'*A;
C = eye(n);
for i = 1:r-1
    C = 1/i*trace(C*B)*eye(n)-C*B;
end

X = r/trace(C*B)*C*(A');

end

测试代码:

A = [7 12 7 6 9
17 32 18 15 14
14 20 12 14 16
15 16 11 14 18];

B = moore_penrose_pinv2(A)

计算结果:

octave:5> source("my_script.m")
B =

  -0.175926   0.212037  -0.619907   0.474074
   0.112434  -0.043783   0.226257  -0.223280
   0.041005   0.120503  -0.391601   0.233862
  -0.400794  -0.100397   0.627579  -0.279365
   0.333333  -0.133333   0.066667  -0.066667


octave:6> source("my_script.m")
B2 =

  -0.175926   0.212037  -0.619907   0.474074
   0.112434  -0.043783   0.226257  -0.223280
   0.041005   0.120503  -0.391601   0.233862
  -0.400794  -0.100397   0.627579  -0.279365
   0.333333  -0.133333   0.066667  -0.066667

两份代码的计算结果一致,代码正确。