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


背景 - Moore-Penrose 伪逆矩阵:

  • 对任意矩阵 ACm×n ,其 Moore-Penrose 逆矩阵 A+Cn×m 存在且唯一。
    • 定义:若矩阵 G 满足 AGA=A, GAG=G, (AG)H=AG, (GA)H=GA ,则 G 是 Moore-Penrose 逆矩阵,可以记作 A+
    • 性质:A+ 满足 A++=A, AH+=A+H, rank(A+)=rank(A), Range/Null(A+)=Range/Null(AH)
  • A+ 求解方法 1(迹方法):
    • Am×n 的秩为 r。
    • 计算 B=ATA
    • C1=In×n
    • for i = 2 to r-1,计算 Ci+1=(1/i)tr(CiB)ICiB
    • 得到 A+=rtr(CrB)CrAT
  • A+ 求解方法 2(满秩分解法):
    • 若 A=FG 是满秩分解,则 A+=GH(FHAGH)1FH

代码 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

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



本文作者:MoonOut

本文链接:https://www.cnblogs.com/moonout/p/17825741.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   MoonOut  阅读(508)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 Sibelius: Violin Concerto in D Minor, Op. 47:III. Allegro, ma non tanto Jascha Heifetz / Chicago Symphony Orchestra
Sibelius: Violin Concerto in D Minor, Op. 47:III. Allegro, ma non tanto - Jascha Heifetz / Chicago Symphony Orchestra
00:00 / 00:00
An audio error has occurred.