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

news2024/12/26 21:51:07

几种求逆矩阵的方法总结,以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;end
	if( abs(det(matrixA)) < tol )
        msg ='the matrix is not full rank';
        error(msg);
    end
    bb = 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;end
	if( abs(det(matrixA)) < tol )
        msg ='the matrix is not full rank';
        error(msg);
    end
    MatrixB=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)
            break
        end
        for j=i+1:N
            num1=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);
        end
    end
    for i=1:N
        Y(1,i) = MatrixB(array1(1),i);
        for j=2:N
            Y(j,i)= MatrixB(array1(j),i)-matrixA(j,1:j-1)*Y(1:j-1,i);
        end
        value(N,i)=Y(N,i)/matrixA(N,N);
        for j=N-1:-1:1
            value(j,i)=(Y(j,i)-matrixA(j,j+1:N)*value(j+1:N,i))/matrixA(j,j);
        end
    end
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;end
	if( abs(det(matrixA)) < tol )
        msg ='the matrix is not full rank';
        error(msg);
    end

    Meye = eye(N);
    for i=1:N
        maxV = matrixA(i,i);
        index=i;
        for j=i+1:N
            if(abs(matrixA(j,i))>abs(maxV))
                maxV = matrixA(j,i);
                index=j;
            end
        end
        for j=1:N
            num1 = 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;
        end
        for j=i+1:N
            num1 = matrixA(j,i)/matrixA(i,i);
            for k=1:N
                matrixA(j,k) = matrixA(j,k) - num1*matrixA(i,k);
                Meye(j,k) = Meye(j,k)-num1*Meye(i,k);
            end
        end
    end

    for i=N:-1:1
        num1 =matrixA(i,i);
        for j=i:N
            matrixA(j,i)=matrixA(j,i)/num1;
        end
        for j=1:N
            Meye(i,j)=Meye(i,j)/num1;
        end
        for j=i-1:-1:1
            num1=matrixA(j,i);
            matrixA(j,i)=0;
            for k=1:N
                Meye(j,k)=Meye(j,k)-num1*Meye(i,k);
            end
        end
    end
    value=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.166388882786055
   1.987598379664842  -4.975548628572671   5.811811940191023   1.012537147110808
  -2.163170299120444   4.249207887174017  -2.673735235716419  -0.856735351177312
  -0.058547952499082  -2.505916255800319   1.268026177518930   1.790575344111539

>> bb

bb =

   1.997894526750277  -1.386596126529541   0.814427151532846   0.166388882786054
   1.987598379664842  -4.975548628572672   5.811811940191024   1.012537147110807
  -2.163170299120444   4.249207887174018  -2.673735235716419  -0.856735351177311
  -0.058547952499082  -2.505916255800319   1.268026177518930   1.790575344111538

>> cc

cc =

   1.997894526750277  -1.386596126529541   0.814427151532846   0.166388882786054
   1.987598379664842  -4.975548628572672   5.811811940191024   1.012537147110807
  -2.163170299120444   4.249207887174018  -2.673735235716419  -0.856735351177311
  -0.058547952499082  -2.505916255800319   1.268026177518930   1.790575344111538

>> dd

dd =

   1.997894526750279  -1.386596126529543   0.814427151532847   0.166388882786054
   1.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.coloradmin.cn/o/1602192.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于LabVIEW的CAN通信系统开发案例

基于LabVIEW的CAN通信系统开发案例 介绍了基于LabVIEW开发的CAN通信系统&#xff0c;该系统主要用于汽车行业的数据监控与分析。通过对CAN通信协议的有效应用&#xff0c;实现了车辆控制系统的高效信息交换与实时数据处理&#xff0c;从而提升了车辆性能的检测与优化能力。 项…

【MySQL数据库】 (篇一 ) 让你快速上手——新手速通版

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、如何起步&#xff1f;&#x1f3c3;‍1.创建数据库&#xff1a;2.选择数据库&#xff1a;3.删除数据库&#xff1a;4.创建表&#xff1a;5.删除表&#xff…

贝锐蒲公英自研异地组网新技术:远程视频监控,流畅度、清晰度大幅提升

在远程视频监控过程中&#xff0c;若遇到网络带宽若遇到网络波动&#xff0c;如&#xff1a;丢包、高延迟等&#xff0c;往往会导致视频流传输时发生数据丢失或延迟现象&#xff0c;从而严重影响视频画面的清晰度和流畅度。 比如&#xff1a;在公司总部集中监看远程矿山或户外水…

华为ensp中静态路由和默认路由的原理及配置

作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年4月17日17点37分 默认路由 [Router] ip route-static <目的网络> <目的网络掩码> <下一跳地址>默认路由的作用是将无法匹配路由表中其他路由表项的…

通过WSL在阿里云上部署Django项目MySQL

前端用Vue&#xff0c;后端用Django&#xff0c; nginx&#xff0c;Mysql 参照&#xff1a; 通过WSL在阿里云上部署Vue项目_阿里云 wsl-CSDN博客 阿里云重登录 采用Ubuntu系统&#xff0c; apt update #检查是否已经安装 mysql --version systemctl status mysql apt insta…

react v18 项目初始化

按照以下命令进行傻瓜式操作即可&#xff1a; 全局安装脚手架工具&#xff1a; npm install -g create-react-app创建项目my-react-app&#xff1a; create-react-app my-react-app安装 antd: yarn add antd安装 react-router-dom&#xff1a; yarn add react-router-dom启动项…

【模拟】Leetcode Z 字形变换

题目讲解 6. Z 字形变换 算法讲解 class Solution { public:string convert(string s, int numRows) {if(numRows 1)return s;string ret;int step 2 * numRows - 2;int n s.size();//记录第一行for(int i 0; i < n; i step){ret s[i];}//处理接下来的行for(int i …

C++练级之路——类和对象(中二)

1、运算符重载 C为了增强代码的可读性引入了运算符重载&#xff0c;运算符重载是具有特殊函数名的函数&#xff0c;也是具有其返回值类型&#xff0c;函数名字以及参数列表&#xff0c;其返回值类型和参数列表与普通的函数类似。 函数名字为&#xff1a;关键字operator后面接需…

【前端面试3+1】14 路由跳转的方式、如何取消已经发送的ajax请求、如何按顺序发起三个ajax请求并按顺序返回、【两个数组的并集】

一、路由跳转的几种方式 1、页面跳转 使用超链接 <a> 标签&#xff1a;通过在页面中定义超链接&#xff0c;用户点击超链接后会跳转到指定的URL页面。使用重定向&#xff1a;服务器端可以通过设置HTTP响应头中的Location字段&#xff0c;将用户重定向到指定的URL页面。使…

MySQL Prepared语句(Prepared Statements)

在数据库应用中&#xff0c;很多SQL语句都会重复执行很多次&#xff0c;每次执行可能只是where条件中的变量值不同&#xff0c;但MySQL依然会解析SQL语法并生成执行计划。对于这类情况&#xff0c;可以利用prepared语句来避免重复解析SQL的开销。 文章目录 一、prepared语句优…

职业技能鉴定服务中心(新闻系统+证书查询系统)

后端采用ThinkPHP8&#xff0c;最新tp框架 前端采用divcss布局 数据库采用MySQL 采用三种技术实现新闻系统和证书查询系统 源码&#xff1a;git clone https://gitee.com/3539949703/certificate-website.git 效果图如下&#xff1a;

2024年国内可用最强AI工具软件应用排行榜TOP8——优点和缺点

中国在2024年持续推动人工智能&#xff08;AI&#xff09;发展&#xff0c;受到政策、技术和市场的三重驱动。诞生了一批人工智能&#xff08;AI&#xff09;领域的新力军。我们通过对国内AI的逐一评测&#xff0c;从各个AI处理结果优略的角度&#xff0c;再结合网络上广大AI用…

bootstrap-select 搜索过滤输入中文问题,前2个字母输入转成空格

bootstrap是v3.3.7的 v1.6.3版本的bootstrap-select,注释以下2行 //that.$menu.find(li).filter(:visible:not(.divider)).eq(0).addClass(active).find(a).focus(); // $(this).focus();

学习在Debian系统上安装Shadowsocks教程

学习在Debian系统上安装Shadowsocks教程 安装shadowsocks-libev及其所需的依赖启动Shadowsocks服务&#xff1a;如果你想要通过代理本地流量&#xff0c;你可以使用ss-local&#xff1a;启动并设置ss-local&#xff1a;查看状态本地连接 安装shadowsocks-libev及其所需的依赖 …

mybatisPlus数据字段填充

这里用到的时实体类User import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import lombok.…

【Linux系统编程】第四弹---基本指令(二)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、echo指令 2、cat指令 3、more指令 4、less指令 4、head指令 5、tail指令 6、时间相关的指令 7、cal指令 8、find指…

Python数据结构【二】查找

前言 可私聊进一千多人Python全栈交流群&#xff08;手把手教学&#xff0c;问题解答&#xff09; 进群可领取Python全栈教程视频 多得数不过来的计算机书籍&#xff1a;基础、Web、爬虫、数据分析、可视化、机器学习、深度学习、人工智能、算法、面试题等。 &#x1f680;&a…

【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器

【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSON2WEB前端框架搭建 【J…

【迅为iMX6Q】开发板 Linux version 6.6.3 SD卡 启动

开发环境 win10 64位 VMware Workstation Pro 16 ubuntu 20.04 【迅为imx6q】开发板&#xff0c; 2G DDR RAM linux-imx 下载 使用 NXP 官方提供的 linux-imx&#xff0c;代码地址为&#xff1a; https://github.com/nxp-imx/linux-imx 使用 git 下载 linux-imx&#xff…

磁盘管理和文件系统

一.磁盘基础 1.磁盘结构 &#xff08;1&#xff09;物理结构&#xff1a; 盘片&#xff1a;硬盘有多个盘片&#xff0c;每盘片2面 磁头&#xff1a;每面一个磁头 &#xff08;2&#xff09;硬盘的数据结构 扇区&#xff1a;盘片被分为多个扇形区域&#xff0c;每个扇区存…