Matlab求矩阵的逆,3种常用方法总结

几种求逆矩阵的方法总结,以Matlab语言为例

  • *0* 引言
  • *1* 简单描述+函数实现
  • *2* 方法调用计算对比


0 引言

  最近在使用函数库求解逆矩阵的时候发现同一个矩阵使用不同的语言、不同的求解方法会产生不同精度的结果,特别是阶数很高的方阵,一些库中的算法为了使计算速度提升,用了非常规方法。这里整理了3种常用的矩阵求逆方法,伴随矩阵法、LU分解法和高斯消元法,并用Matlab进行了实现,一些过程参考了NET博文:

1 简单描述+函数实现

伴随矩阵法
  对于一个矩阵A,如果它的伴随矩阵存在,并且A的行列式不为零,那么A的逆矩阵等于它的伴随矩阵除以A的行列式。

  设A是一个n阶矩阵,其伴随矩阵为A*。那么A的逆矩阵为 A − 1 A^{-1} A1,根据公式:

A − 1 = A ∗ / ∣ A ∣ A^{-1} = A* / |A| A1=A/∣A

  其中,|A|表示A的行列式。

  因此,如果你已经求得了矩阵A的伴随矩阵A*,并且知道A的行列式|A|不为零,那么你可以通过上述公式来求得A的逆矩阵A^(-1)。

% 伴随矩阵法求逆矩阵
function value = inv_Adjoint(matrixA,tol)As = size(matrixA);N = As(1);if(nargin < 2)tol = 1e-15;endif( abs(det(matrixA)) < tol )msg ='the matrix is not full rank';error(msg);endbb = adjoint(matrixA); % 伴随矩阵法d = det(matrixA); % 矩阵的行列式子value = bb/d;
end

LU分解法;
  LU分解是一种将矩阵分解为一个下三角矩阵和一个上三角矩阵的方法。这种分解方法可以有效地将矩阵求逆的计算量减少一半。具体步骤如下:

  1. 将原矩阵表示为A = LU,其中L是一个下三角矩阵,U是一个上三角矩阵。
  2. 解下三角矩阵方程LY = I,其中Y是一个列向量,I是单位矩阵。
  3. 解上三角矩阵方程UX = Y,其中X是一个列向量。
  4. 求解出的X就是原矩阵A的逆矩阵。

  这种方法的好处是可以避免直接使用矩阵求逆的方法,提高计算精度。由于LU分解方法是通过矩阵的分解来求逆,因此可以在一定程度上避免了矩阵求逆时可能出现的数值不稳定性。

  然而,需要注意的是,当原矩阵的行列式为0时,即矩阵不可逆时,LU分解方法无法计算逆矩阵。在这种情况下,我们需要采用其他方法来求解。

  总结起来,对于矩阵求逆,LU分解是一种精度较高的方法。它通过将矩阵分解为下三角矩阵和上三角矩阵来进行计算,从而提高了计算精度,并且避免了一些数值不稳定性的问题。

% LU分解求逆
function value = inv_lu(matrixA,tol)As = size(matrixA);N = As(1);value = zeros(N,N);if(nargin < 2)tol = 1e-15;endif( abs(det(matrixA)) < tol )msg ='the matrix is not full rank';error(msg);endMatrixB=eye(N); Y = value;array1 =1:N;for i=1:N-1[~, j]=max(abs(matrixA(i:N,i)));num1 = matrixA(i,:);matrixA(i,:) = matrixA(j+i-1,:);matrixA(j+i-1,:) = num1;num1 = array1(i);array1(i) = array1(j+i-1);array1(j+i-1) = num1;if (matrixA(i,i)==0)breakendfor j=i+1:Nnum1=matrixA(j,i)/matrixA(i,i);matrixA(j,i) = num1;matrixA(j,i+1:N)=matrixA(j,i+1:N)-num1*matrixA(i,i+1:N);endendfor i=1:NY(1,i) = MatrixB(array1(1),i);for j=2:NY(j,i)= MatrixB(array1(j),i)-matrixA(j,1:j-1)*Y(1:j-1,i);endvalue(N,i)=Y(N,i)/matrixA(N,N);for j=N-1:-1:1value(j,i)=(Y(j,i)-matrixA(j,j+1:N)*value(j+1:N,i))/matrixA(j,j);endend
end 

高斯消元法;
  要用高斯消元法求一个n*n矩阵的逆矩阵,可以按以下步骤进行:

  1. 将原矩阵和单位矩阵合并成一个增广矩阵,形成一个4*8的矩阵。
  2. 利用高斯消元法将矩阵的左半部分化为上三角矩阵。
  3. 利用高斯消元法将矩阵的右半部分也化为上三角矩阵。
  4. 将得到的上三角矩阵进行回代,将其化为单位矩阵。
  5. 得到的矩阵的右半部分即为所求的逆矩阵。
% 高斯消元法求逆矩阵
function value = inv_gaosi(matrixA,tol)rc = size(matrixA);N = rc(1);value = zeros(N,N);if(nargin < 2)tol = 1e-15;endif( abs(det(matrixA)) < tol )msg ='the matrix is not full rank';error(msg);endMeye = eye(N);for i=1:NmaxV = matrixA(i,i);index=i;for j=i+1:Nif(abs(matrixA(j,i))>abs(maxV))maxV = matrixA(j,i);index=j;endendfor j=1:Nnum1 = matrixA(i,j);matrixA(i,j) = matrixA(index,j);matrixA(index,j) = num1;num1=Meye(i,j);Meye(i,j) = Meye(index,j);Meye(index,j) = num1;endfor j=i+1:Nnum1 = matrixA(j,i)/matrixA(i,i);for k=1:NmatrixA(j,k) = matrixA(j,k) - num1*matrixA(i,k);Meye(j,k) = Meye(j,k)-num1*Meye(i,k);endendendfor i=N:-1:1num1 =matrixA(i,i);for j=i:NmatrixA(j,i)=matrixA(j,i)/num1;endfor j=1:NMeye(i,j)=Meye(i,j)/num1;endfor j=i-1:-1:1num1=matrixA(j,i);matrixA(j,i)=0;for k=1:NMeye(j,k)=Meye(j,k)-num1*Meye(i,k);endendendvalue=Meye;
end

2 方法调用计算对比

clc;clear;
format long
a = [0.863926332645926,2.744822685285432E-002,0.358800923218055,7.587357258855056E-002;...0.737486519704736,0.275982186877394,0.928772666000609,0.219795611073554;...0.172452279207503,0.378156212690881,0.506403133293737,1.243293753676099E-002;...0.938238414353813,0.119337792575225,0.952934573404228,0.859760719854225];
aa = inv(a); %
bb =inv_gaosi(a); % 高斯消元法
cc =inv_lu(a);
dd = inv_Adjoint(a);%% .............................................................%% ......... out ............
aa =1.997894526750277  -1.386596126529541   0.814427151532846   0.1663888827860551.987598379664842  -4.975548628572671   5.811811940191023   1.012537147110808-2.163170299120444   4.249207887174017  -2.673735235716419  -0.856735351177312-0.058547952499082  -2.505916255800319   1.268026177518930   1.790575344111539>> bbbb =1.997894526750277  -1.386596126529541   0.814427151532846   0.1663888827860541.987598379664842  -4.975548628572672   5.811811940191024   1.012537147110807-2.163170299120444   4.249207887174018  -2.673735235716419  -0.856735351177311-0.058547952499082  -2.505916255800319   1.268026177518930   1.790575344111538>> cccc =1.997894526750277  -1.386596126529541   0.814427151532846   0.1663888827860541.987598379664842  -4.975548628572672   5.811811940191024   1.012537147110807-2.163170299120444   4.249207887174018  -2.673735235716419  -0.856735351177311-0.058547952499082  -2.505916255800319   1.268026177518930   1.790575344111538>> dddd =1.997894526750279  -1.386596126529543   0.814427151532847   0.1663888827860541.987598379664844  -4.975548628572673   5.811811940191022   1.012537147110807-2.163170299120446   4.249207887174019  -2.673735235716419  -0.856735351177311-0.058547952499082  -2.505916255800320   1.268026177518929   1.790575344111539

  仔细观察不难看出,在小数点后15位左右不同方法间会存在微笑差异,这个差异或者叫误差在一般计算中无所谓,可以被忽略,但对精度要求特高的过程,就需要斟酌一下,使用哪种求逆方法可以最大限度减小计算误差带来的影响。



还有哪些好的方法可以留言交流,希望对你有所帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/615537.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 中文官方教程 2022 版(四十九)

原文&#xff1a;docs.oracle.com/javase/tutorial/reallybigindex.html JAXB 示例 原文&#xff1a;docs.oracle.com/javase/tutorial/jaxb/intro/examples.html 以下部分描述如何使用包含在 JAXB RI 捆绑包中的示例应用程序。JAXB RI 捆绑包可从jaxb.java.net获取。下载并安装…

力扣HOT100 - 56. 合并区间

解题思路&#xff1a; class Solution {public int[][] merge(int[][] intervals) {// 先按照区间起始位置排序Arrays.sort(intervals, (v1, v2) -> v1[0] - v2[0]);int[][] res new int[intervals.length][2];int idx -1;for (int[] interval : intervals) {//直接加入的…

深度学习的模型有几类,能干嘛用?

1、基础模型 &#xff08;1&#xff09;卷积神经网络 **卷积&#xff1a;**卷积的本质是通过矩阵运算9的方式将输入数据进行空间上的滤波&#xff0c;有效地提取数据中的局 部特征&#xff0c;从而实现特征数据更高程度的抽象表示。 **池化&#xff1a;**可以理解成“压缩”…

图片合成二维码怎么实现?图片二维码的生成技巧

图片合成二维码如何制作呢&#xff1f;现在很多的二维码都会提供图片预览的功能&#xff0c;我们可以用手机扫描二维码来查看图片的信息&#xff0c;比如很多的产品信息、旅游攻略、产品海报等等类型经常会制作这种类型的二维码。 其实图片制作二维码的方法很简单&#xff0c;…

MySQL:MySQL的查询(上)

文章目录 MySQL的增加单行数据插入多行数据插入插入否则更新替换 MySQL的查询select列where语句 本篇开始总结的是MySQL当中的基本查询语句 对于数据库的查询&#xff0c;无非大致就是增删查改&#xff0c;因此对于这些内容进行一一解释&#xff1a; MySQL的增加 单行数据插…

【Qt 学习笔记】Qt控件概述

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt控件概述 文章编号&#xff1a;Qt 学习笔记 / 14 文章目录 Qt控件概…

如何申请阿里云服务器学生优惠,入口在这呢!

阿里云学生服务器免费申请&#xff0c;之前是云翼计划学生服务器9元/月&#xff0c;现在是高校计划&#xff0c;学生服务器可以免费申请&#xff0c;先完成学生认证即可免费领取一台云服务器ECS&#xff0c;配置为2核2G、1M带宽、40G系统盘&#xff0c;在云服务器ECS实例过期之…

【软考】哈希表

目录 一、概念1.1 定义 二、哈希函数的构造方法2.1 说明2.2 特性 三、处理冲突的方法3.1 说明3.2 开放定址法3.2.1 说明3.2.2 线性探测 3.3 链地址法3.4 再哈希法3.5 建立公共溢出区 四、哈希表的查找4.1 查找过程4.2 查找特点4.3 装填因子 一、概念 1.1 定义 1.一般存储结构由…

Golang | Leetcode Golang题解之第19题删除链表的倒数第N个结点

题目&#xff1a; 题解&#xff1a; func removeNthFromEnd(head *ListNode, n int) *ListNode {dummy : &ListNode{0, head}first, second : head, dummyfor i : 0; i < n; i {first first.Next}for ; first ! nil; first first.Next {second second.Next}second.N…

同态滤波的Python源码

同态滤波前 &#xff08;左&#xff09; 同态滤波后&#xff08;右&#xff09; 源码见下面链接&#xff1a; https://download.csdn.net/download/qqqweiweiqq/89129996?spm1001.2014.3001.5501

Leetcode算法训练日记 | day25

一、组合总和Ⅲ 1.题目 Leetcode&#xff1a;第 216 题 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺…

HDFS [MSST‘10] 论文阅读笔记

原论文&#xff1a;The Hadoop Distributed File System (MSST’10) HDFS关键技术要点概览 设计目标&#xff1a;HDFS旨在可靠地存储大型数据集&#xff0c;并以高带宽流式传输这些数据集到用户应用程序。它通过在大量服务器上分布存储和计算资源&#xff0c;使得资源可以随着…