伪逆矩阵 的使用

news/2024/12/1 0:45:07/

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


http://www.ppmy.cn/news/21268.html

相关文章

【JavaScript速成之路】一文带你初识JavaScript

📃个人主页:「小杨」的csdn博客 🔥系列专栏:【JavaScript速成之路】 🐳希望大家多多支持🥰一起进步呀! 文章目录前言1,JavaScript1.1,JavaScript概述1.2,Java…

XCP实战系列导读

本文框架1.系列概述2.XCP实战系列文章1.系列概述 在前面一篇文章《看了就会的XCP协议介绍》中详细介绍了XCP的协议,其中包括XCP的一般工作过程,常用命令,XCP测量及标定功能级别的实现,在本系列将结合笔者在工作中的应用经验对XCP…

MySQL数据库(关系型数据库和非关系型数据库的对比,数据库相关概念和常用的设计规则)

MySQL数据库的概述 为什么需要使用数据库: 满足持久化的需求,(将数据保存到可掉电式存储设备中以便之后使用),数据持久化意味着将内存中的数据保存到硬盘上加以“固化”持久化的主要作用:将内存中的数据存…

【虚拟仿真】Unity3D中实现鼠标悬浮模型上显示文字

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 在仿真项目开发中,会遇到让鼠标悬浮模型后显示模型…

Secure Hash Algorithm-3 (SHA-3) family

参考文献: Bertoni G, Daemen J, Peeters M, et al. Keccak[C]//Advances in Cryptology–EUROCRYPT 2013: 32nd Annual International Conference on the Theory and Applications of Cryptographic Techniques, Athens, Greece, May 26-30, 2013. Proceedings 32…

【184】Win10下Java8调用Python的face_recognition库来实现人脸识别

前言 face_recognition 是一个开源的、人脸识别的Python库。本文讲解了在 Windows 10操作系统上,使用 Java8 来调用 Python 的 face_recognition 库来实现人脸识别。虽然 Java8 有 Jython,但是由于截至发文时 Jython 支持的版本太老(只有Pyt…

Unity二

一、脚本的创建 可以在project视图中的Assets文件夹中右键创建一个C#脚本,可以将脚本分类放在不同的文件夹中,或者点击游戏对象后在Inspector视图中找到最下方的添加组件按钮,然后点击新建脚本即可。若在project视图中创建的脚本&#xff0c…

shell脚本set -eu引起的学习笔记

本文将介绍Bash中 set -euxo pipefail 大佬的文章学习膜拜体验,它们可以帮助你写出更容易维护也更安全的脚本。这也是Bash脚本的终极调试手段,希望你以后在自己的脚本中加上这么一行,头顶也能少秃一点 今天打开一个脚本《JetsonNano使能SPI总…