【线性代数 C++】求逆矩阵

  • 对于 n n n阶矩阵 A A A,如果有 n n n阶矩阵 B B B,使 A B = B A = E AB=BA=E AB=BA=E,则说 A A A是可逆的,并把 B B B称为 A A A逆矩阵.
  • A A A的逆矩阵记作 A − 1 A^{-1} A1,则 B = A − 1 B=A^{-1} B=A1.
  • ∣ A ∣ ≠ 0 \begin{vmatrix}A\end{vmatrix} \neq 0 A =0,则 A A A可逆,且 A − 1 = 1 ∣ A ∣ A ∗ A^{-1}= \frac{1}{\begin{vmatrix}A \end{vmatrix}}A^* A1=A1A.
  • 上式中, ∣ A ∣ \begin{vmatrix}A\end{vmatrix} A A A A的行列式, A ∗ A^* A A A A的伴随矩阵.
  • 根据上述内容,为求逆矩阵,需要分别求得矩阵行列式的值和矩阵的逆矩阵.

1 矩阵行列式求值

1.1 定义

  • n n n阶方阵 A A A的元素构成的行列式(各元素位置不变),称为 A A A的行列式,记作 ∣ A ∣ \begin{vmatrix}A \end{vmatrix} A d e t A detA detA.

1.2 C++代码

为便于管理函数,建立行列式类CDeterminant.

  • 求行列式值的两种途径:一是根据行列式定义、二是利用代数余子式.
  • 在CDeterminant类中增加两个成员函数GetCetValByDef()和GetDetValByRem(),相关代码参考【线性代数|行列式定义及其值】和【线性代数 | C++】行列式按行(列)展开。

2 求伴随矩阵

2.1 定义

  • 行列式 ∣ A ∣ \begin{vmatrix}A\end{vmatrix} A 各元素的代数余子式 A i j A_{ij} Aij构成的如下矩阵 A ∗ = [ A 11 A 21 ⋯ A n 1 A 12 A 22 ⋯ A n 2 ⋮ ⋮ ⋮ A 1 n A 2 n ⋯ A n n ] , A^*=\begin{bmatrix}A_{11} & A_{21} & \cdots & A_{n1} \\A_{12} & A_{22} & \cdots & A_{n2} \\ \vdots & \vdots && \vdots \\A_{1n} & A_{2n} &\cdots & A_{nn}\end{bmatrix}, A= A11A12A1nA21A22A2nAn1An2Ann ,称为矩阵 A A A伴随矩阵.
  • 注意:伴随矩阵 A ∗ A^* A中元素的位置与对应行列式 ∣ A ∣ \begin{vmatrix}A\end{vmatrix} A 中元素的位置呈转置关系.

2.2 C++代码

2.2.1 求余子式
  • 由定义可知,求伴随矩阵,需先求行列式各元素的代数余子式.
  • 求代数余子式,需先求余子式.
  • 故,在CDeterminant类中增加一个求行列式余子式的成员函数GetDetRem().
//在CDeterminant.h声明成员函数
static bool GetDetRem
(const vector<vector<double>> &vvDetInput, //原始行列式int i,  //待求余子式元素的行号int j,  //待求余子式元素的列号vector<vector<double>> &vvDetRet    //求得的余子式
);
//在CDeterminant.cpp中定义成员函数
bool CDeterminant::GetDetRem
(const vector<vector<double>> &vvDetInput, int i, int j,vector<vector<double>> &vvDetRet
)
{if (false == IsDet(vvDetInput))//形参是否符合行列式格式要求return false;vvDetRet.clear();vvDetRet = vvDetInput;//删除元素所在的行vvDetRet.erase(vvDetRet.cbegin() + i);for (int i = 0; i < vvDetRet.size(); i++){//删除元素所在的列vvDetRet[i].erase(vvDetRet[i].cbegin() + j);}return true;
}
2.2.2 求伴随矩阵
  • 在CMatrix类中添加GetAdjointMat函数,用于求伴随矩阵.其思路是:
    1. 按列逐行取得矩阵的元素;
    2. 求相应的余子式
    3. 对余子式求值
    4. 求代数余子式
    5. 将代数余子式的值,按行填入新矩阵
    6. 得到伴随矩阵
//在CMatrix.h中声明成员函数
static bool GetAdjointMat
(
const vector<vector<double>> &vvMatInput,
vector<vector<double>> &vvMatRet
);
//在CMatrix.cpp中定义成员函数
bool CMatrix::GetAdjointMat
(const vector<vector<double>> &vvMatInput,vector<vector<double>> &vvMatRet
)
{//判断vector变量是否符合行列式格式if (false == CDeterminant::IsDet(vvMatInput))return false;vvMatRet.clear();vector<double> vTemp;//临时存储伴随矩阵的行元素vector<vector<double>> vvDetTemp;//临时存储余子式double iDetValTemp;//临时存储余子式的值//按列循环for (int i = 0; i < vvMatInput[0].size(); i++){vTemp.clear();//按行循环for (int j = 0; j < vvMatInput.size(); j++){//求余子式vvDetTemp.clear();CDeterminant::GetDetRem(vvMatInput, j, i, vvDetTemp);//余子式求值iDetValTemp = 0;CDeterminant::GetDetValByDef(vvDetTemp, iDetValTemp);//求代数余子式iDetValTemp = (pow(-1, i + j) * iDetValTemp);//代数余子式的值填入新矩阵的行元素中vTemp.push_back(iDetValTemp);}  //行元素填入新矩阵中vvMatRet.push_back(vTemp);  }  return true;
}

3 求逆矩阵

  • 利用前面求得的 ∣ A ∣ \begin{vmatrix}A \end{vmatrix} A A ∗ A^* A,按照公式 A − 1 = 1 ∣ A ∣ A ∗ A^{-1}= \frac{1}{\begin{vmatrix}A \end{vmatrix}}A^* A1=A1A,可以求得 A A A的逆矩阵.
  • 在CMatrix类中增加GetInverseMat函数,以实现上述功能.
//在CMatrix.h中声明函数
static bool GetInverseMat
(
const vector<vector<double>> &vvMatInput,
vector<vector<double>> &vvInverseMat
);
//在CMatrix.cpp中定义函数
bool CMatrix::GetInverseMat
(const vector<vector<double>> &vvMatInput,vector<vector<double>> &vvInverseMat
)
{if (false == CDeterminant::IsDet(vvMatInput))return false;//方阵行列式值不等于0时,方阵可逆double fDetVal;CDeterminant::GetDetValByDef(vvMatInput, fDetVal);if (0 == fDetVal)return false;  fDetVal = 1.0 / fDetVal;vector<vector<double>> vvMatTemp;GetAdjointMat(vvMatInput, vvMatTemp);//求伴随矩阵vvInverseMat.clear();MatMulti(fDetVal, vvMatTemp, vvInverseMat);//求数与矩阵相乘return true;
}

4 测试

//在test.cpp中测试
#include <iostream>
#include <iomanip>
#include <vector>#include "CMatrix.h"using namespace std;bool PrintMat
(const vector<vector<double>> &vvMat
)
{for (int i = 0; i < vvMat.size(); i++){for (int j = 0; j < vvMat[i].size(); j++){cout << setw(5) << vvMat[i][j];}cout << endl;}return true;
}int main()
{vector<vector<double>> vvMatA{{ 1, 2, 3},{ 2, 2, 1},{ 3, 4, 3}};vector<vector<double>> vvMatRet;if (false == CMatrix::GetInverseMat(vvMatA, vvMatRet)){cout << "计算失败" << endl;}else{PrintMat(vvMatRet);} return 0;
}

在这里插入图片描述


  1. 引用文献:《工程数学 线性代数(第五版)》同济大学数学系编,高等教育出版社.
  2. 以上为个人学习、练习的记录,如有错误,欢迎指正.

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

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

相关文章

GRE技术原理:揭开网络封装的神秘面纱

GRE技术原理&#xff1a;揭开网络封装的神秘面纱 概述 本文将深入探讨GRE&#xff08;Generic Routing Encapsulation&#xff0c;通用路由封装&#xff09;技术的原理。我们将从GRE的基本概念出发&#xff0c;分析其在网络中的应用场景&#xff0c;详细阐述其封装与解封装过…

idea创建完项目如何隐藏不重要的文件

如果您不打算直接使用这些脚本&#xff0c;而是更倾向于通过IDEA的内置工具来运行Maven命令&#xff0c;那么您可以选择隐藏这些文件。但是&#xff0c;隐藏这些文件并不会影响它们的功能&#xff0c;只是在项目视图中不再显示它们。 1.转到 File > Settings&#xff08;Wi…

创建一个区块链,是由三个节点组成的去中心化网络。

目录 一、准备工作&#xff1a; 1、创建三个python文件&#xff1a; 2、创建nodes.json文件 3、transaction.json文件 4、打开三个控制台 二、在三个节点上进行交互。 二、添加交易发布请求&#xff08;a向b发送10000coin&#xff09; 一、准备工作&#xff1a; 1、创建…

typescript中 declare global 关键字用法

在 TypeScript 中&#xff0c;declare global 用于在模块内部扩展全局作用域。当你在模块&#xff08;任何包含顶级 import 或 export 的文件&#xff09;中工作时&#xff0c;TypeScript 会将该文件的作用域视为局部作用域。如果你需要添加或修改全局作用域中的类型&#xff0…

【MySQL】排序和分页

1. 排序 1.1 排序规则 使用 ORDER BY 子句排序ASC&#xff08;ascend&#xff09;: 升序DESC&#xff08;descend&#xff09;:降序ORDER BY 子句在SELECT语句的结尾。 1.2 单列排序 例子&#xff1a;根据年龄排序&#xff08;默认升序&#xff09; SELECT name, age, gende…

什么是BEPI? 跟BSCI有什么区别?

什么是BEPI&#xff1f; 欧洲对外贸易协会&#xff08;FTA&#xff09;在2014年发起了商界环境绩效倡议&#xff08;BEPI&#xff09;&#xff0c;英文全称是Business Environmental Performance 简称BEPI。BEPI采用行业最佳实践以及切实可行的技术专业知识&#xff0c;增加企业…

LeetCode - 611.有效三角形个数

题目链接 LeetCode - 611. 有效三角形的个数 动画解释 代码解释 class Solution { public:int triangleNumber(vector<int>& nums) {sort(nums.begin(),nums.end());int cout 0;int fix nums.size()-1;while(fix>1){int left 0;int right fix-1;while(left &l…

[集群聊天项目] muduo网络库

目录 网络服务器编程常用模型什么是muduo网络库什么是epoll muduo网络库服务器编程 网络服务器编程常用模型 【方案1】 &#xff1a; accept read/write 不是并发服务器 【方案2】 &#xff1a; accept fork - process-pre-connection 适合并发连接数不大&#xff0c;计算任…

在Vue中如何渲染使用Vue写法的HTML文件?

在Vue.js中&#xff0c;我们可以使用Vue的语法来编写HTML文件&#xff0c;并通过Vue实例来渲染这些文件。下面是一种常见的方法&#xff1a; 创建Vue实例&#xff1a;首先&#xff0c;我们需要创建一个Vue实例&#xff0c;以便将Vue绑定到HTML文件中。 指定el属性&#xff1a;…

在 Linux 上把 Vim 配置为默认编辑器

目录 ⛳️推荐 在 Linux 命令行中编辑 将 Vim 设置为其他程序的默认值 在 Alpine 中编辑电子邮件 总结 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 我使用 Linux 大概有…

NTP授时服务器(GPS授时器)在DCS系统应用

NTP授时服务器&#xff08;GPS授时器&#xff09;在DCS系统应用 前言 随着计算机和网络通信技术的飞速发展&#xff0c;各行业自动化系统数字化、网络化的时代已经到来。这一方面为各控制和信息系统之间的数据交换、分析和应用提供了更好的平台、另一方面对各种实时和历史数据…

【MHA】MySQL高可用MHA介绍7-常见问题

目录 常见问题解答 支持哪些 MySQL 版本&#xff1f; 支持哪些操作系统&#xff1f; MHA 可靠吗&#xff1f; 是否提供 MHA 的商业支持&#xff1f; 是否支持基于行的二进制日志格式&#xff1f; 在云环境中是否工作&#xff1f; 是否有其他解决方案可以完成与 MHA 相同…

Golang实现一个批量自动化执行树莓派指令的软件(1)文本加密配置命令行交互实现

简介 实现一个在配置文件设置信息&#xff0c;一运行就可以自动执行设定指令的软件。 这次实现的是 &#xff1a; 1. 加密解密模块&#xff0c; 用于加密密码&#xff0c; 在配置时配置已加密的密码就可以&#xff1b; 2. 需要配置&#xff0c;自然也就有配置文件的序列化反序列…

Unity读书系列《Unity3D游戏开发》——脚本(一)

文章目录 前言一、脚本模版及其拓展1、脚本模版2、拓展脚本模版 二、脚本的生命周期三、脚本的执行顺序四、脚本序列化1、序列化数据2、serializedObject3、监听部分元素修改事件 五、定时器与间隔定时器六、工作线程&#xff08;多线程&#xff09;总结 前言 脚本在Unity的重…

【信安评估】2024年全国职业院校技能大赛高职组“信息安全管理与评估”安徽省选拔赛赛项规程

培训、环境、资料、考证 公众号&#xff1a;Geek极安云科 网络安全群&#xff1a;624032112 网络系统管理群&#xff1a;223627079 网络建设与运维群&#xff1a;870959784 移动应用开发群&#xff1a;548238632 极安云科专注于技能提升&#xff0c;赋能 2024年广东省高校的技…

ChatGPT API - 笔记

1 新手如何用Python玩转ChatGPT API,详细讲解 新手如何用Python玩转ChatGPT API,详细讲解-Django社区,Django中文网,django教程,Django! import time import requestsOPENAI_API_KEY = "****" proxy = "127.0.0.1:7890" # 你需要添加你的代理,懂得都…

Centos的一些基础命令

CentOS是一个基于开源代码构建的免费Linux发行版&#xff0c;它由Red Hat Enterprise Linux (RHEL) 的源代码重新编译而成。由于 CentOS是基于RHEL构建的&#xff0c;因此它与RHEL具有非常类似的特性和功能&#xff0c;包括稳定性、安全性和可靠性。并且大部分的 Linux 命令在C…

sqlplus / as sysdba登陆失败,(ORA-01017)

周一上班检查alert log&#xff0c;看到某个库报出大量的错误 提示无法连接到ASM实例&#xff0c;这是某知名MES厂商DBA创建的11G RAC刚刚​转交到我手上的&#xff0c;这又是给我挖了什么坑&#xff1f; 报错为ORA-01017​用户名密码不对&#xff1f;​what&#xff1f; 登陆o…

大语言模型在研究领域的应用——信息检索中的大语言模型

信息检索中的大语言模型 大语言模型提升信息检索任务利用大语言模型进行信息检索大语言模型增强的信息检索模型.检索增强的大语言模型输入优化策略.指令微调策略.预训练策略.总结应用建议未来方向大语言模型对于传统信息检索技术与应用范式带来了重要影响。这两者在技术路径上具…

在Mac M1笔记本上跑大语言模型llama3的4个步骤?(install、pull、run、ask)

要点 Ollama一个功能强大的本地大语言模型LLM运行工具&#xff0c;支持很多模型&#xff0c;并且操作极其简单快速回忆步骤&#xff1a; 下载ollama工具&#xff1a;https://ollama.com/download 下载模型&#xff1a;ollama pull llama3 #根据libs列表直接指定名字 运行模型…