C++ 中的逆矩阵
本文将解释矩阵求逆及其使用 C++ 的实现。 为了方便理解C++的实现,我们首先需要理解矩阵逆的概念。
矩阵的逆
求矩阵的逆矩阵需要三个步骤。 下面给出步骤的解释。
- 第一步,计算给定矩阵的行列式。
- 在第二步中,如果行列式不等于零,则计算给定矩阵的伴随。
- 最后,将步骤2中得到的矩阵乘以1/行列式。
矩阵逆的数学公式
令 S 为 3 x 3 矩阵。 那么求其倒数的公式如下。
下面是一个用 C++ 求 3x3 阶矩阵的逆矩阵的程序。 为了简单起见,我们使用数组来存储矩阵。
仅当矩阵非奇异时,程序才会找到矩阵的逆。 我们可以通过以下性质来验证我们的答案。
这里 I 是单位矩阵,其对角线中的条目为 1。 如果上述性质成立,我们的答案就是正确的; 否则为假。
拟议的程序分为多个模块。
3x3 矩阵逆矩阵的 C++ 实现
矩阵逆可以使用向量、模板和类来实现。 然而,为了简单起见,我们将使用 2D 数组来确定 3x3 矩阵的逆矩阵。
然后可以将该解决方案推广到求 NxN 矩阵的逆矩阵。
我们来一一解释一下该程序的组成部分。
主函数
int main() // main function
{
float matrix3X3[3][3];
int r,c;
float determinant=0;
for(r = 0; r < 3; r++){
for(c = 0; c< 3; c++){
cout<<"Enter the value at index ["<<r<<"]["<<c<<"] : ";
cin>>matrix3X3[r][c];
}
}
display(matrix3X3);
determinant=findDeterminant(matrix3X3);
cout<<"\n\nDeteterminant of the given matrix is : "<<determinant;
if(determinant!=0){
adjoint(matrix3X3);
inverse(matrix3X3,determinant);
}
else
{
cout<<" As the determinant of the given matrix is 0, so we cannot take find it's Inverse :";
}
}
在主函数中,我们创建了要求其逆矩阵。 然后,我们应用条件检查来确定矩阵是否奇异。
如果非奇异,则将通过函数计算矩阵的逆。 这是我们创建的每个函数的解释。
Display 函数
void display(float matrix3X3[][3]){
printf("\nThe Elements of the matrix are :");
for(int r = 0; r < 3; r++){
cout<<"\n";
for(int c = 0; c < 3; c++){
cout<<matrix3X3[r][c]<<"\t";
}
}
}
显示函数用于显示矩阵。 这里matrix3X3是要显示其值的矩阵。
行列式计算功能
float findDeterminant(float matrix3X3[][3]){
float det=0; // here det is the determinant of the matrix.
for(int r = 0; r < 3; r++){
det = det + (matrix3X3[0][r] * (matrix3X3[1][(r+1)%3] * matrix3X3[2][(r+2)%3] - matrix3X3[1][(r+2)%3] * matrix3X3[2][(r+1)%3]));
}
return det;
}
findDeterminant 函数用于查找矩阵的行列式。 这里,det是矩阵matrix3X3行列式。
看到行列式后,我们可以得出矩阵逆是否可能的结论。
Adjoint 函数
void adjoint(float matrix3X3[][3]){
cout<<"\n\nAdjoint of matrix is: \n";
for(int r = 0; r < 3; r++){
for(int c = 0; c < 3; c++){
cout<<((matrix3X3[(c+1)%3][(r+1)%3] * matrix3X3[(c+2)%3][(r+2)%3]) - (matrix3X3[(c+1)%3][(r+2)%3] * matrix3X3[(c+2)%3][(r+1)%3]))<<"\t";
}
cout<<endl;
}
}
伴随函数用于求矩阵的伴随函数。 找到伴随矩阵后,我们将其与行列式的倒数相乘以求逆矩阵。
Inverse 函数
void inverse(float matrix3X3[][3],float d){
cout<<"\n\nInverse of matrix is: \n";
for(int r = 0; r < 3; r++){
for(int c = 0; c < 3; c++){
cout<<((matrix3X3[(c+1)%3][(r+1)%3] * matrix3X3[(c+2)%3][(r+2)%3]) - (matrix3X3[(c+1)%3][(r+2)%3] * matrix3X3[(c+2)%3][(r+1)%3]))/d<<"\t";
}
cout<<endl;
}
}
最后,使用逆函数计算矩阵的逆。 在此函数中,将伴随矩阵的每个条目除以行列式以找到矩阵逆矩阵。
现在让我们看一下 3x3 矩阵逆矩阵的完整代码。
完整的C++程序
#include<iostream>
using namespace std;
void display(float matrix3X3[][3]){
printf("\nThe Elements of the matrix are :");
for(int r = 0; r < 3; r++){
cout<<"\n";
for(int c = 0; c < 3; c++){
cout<<matrix3X3[r][c]<<"\t";
}
}
}
// This function will calculate the determinant of the given matrix
float findDeterminant(float matrix3X3[][3]){
float det=0; // here det is the determinant of the matrix.
for(int r = 0; r < 3; r++){
det = det + (matrix3X3[0][r] * (matrix3X3[1][(r+1)%3] * matrix3X3[2][(r+2)%3] - matrix3X3[1][(r+2)%3] * matrix3X3[2][(r+1)%3]));
}
return det;
}
// This function will calculate the adjoint of the given matrix
void adjoint(float matrix3X3[][3]){
cout<<"\n\nAdjoint of matrix is: \n";
for(int r = 0; r < 3; r++){
for(int c = 0; c < 3; c++){
cout<<((matrix3X3[(c+1)%3][(r+1)%3] * matrix3X3[(c+2)%3][(r+2)%3]) - (matrix3X3[(c+1)%3][(r+2)%3] * matrix3X3[(c+2)%3][(r+1)%3]))<<"\t";
}
cout<<endl;
}
}
// This function will find the Inverse of the given matrix
void inverse(float matrix3X3[][3],float d){
cout<<"\n\nInverse of matrix is: \n";
for(int r = 0; r < 3; r++){
for(int c = 0; c < 3; c++){
cout<<((matrix3X3[(c+1)%3][(r+1)%3] * matrix3X3[(c+2)%3][(r+2)%3]) - (matrix3X3[(c+1)%3][(r+2)%3] * matrix3X3[(c+2)%3][(r+1)%3]))/d<<"\t";
}
cout<<endl;
}
}
int main() // main function
{
float matrix3X3[3][3];
int r,c;
float determinant=0;
for(r = 0; r < 3; r++){
for(c = 0; c< 3; c++){
cout<<"Enter the value at index ["<<r<<"]["<<c<<"] : ";
cin>>matrix3X3[r][c];
}
}
display(matrix3X3);
determinant=findDeterminant(matrix3X3);
cout<<"\n\nDeteterminant of the given matrix is : "<<determinant;
if(determinant!=0){
adjoint(matrix3X3);
inverse(matrix3X3,determinant);
}
else
{
cout<<" As determinant of the given matrix is 0, so we cannot take find it's Inverse :";
}
}
当矩阵为奇异矩阵时,我们的算法不会计算矩阵的逆。
当矩阵非奇异时,我们的算法仅在矩阵非奇异时才计算逆矩阵。
相关文章
用 C++ 读取 PPM 文件
发布时间:2023/08/24 浏览次数:108 分类:C++
-
在本文中,我们将了解 PPM 文件并使用 C++ 读取它们。我们将首先讨论并了解 PPM 文件格式。 稍后,我们将学习用 C++ 读取 PPM 文件的分步过程。
检查 Linux 中的 C++ 编译器版本
发布时间:2023/08/24 浏览次数:60 分类:C++
-
本文是关于检查 Linux 操作系统上安装的 C++ 编译器的版本。 此外,在撰写本文时,我们还将探讨 C++ 最新版本 C++ 11 的激活过程。检查 Linux 中的 C++ 编译器版本
C++ 中结构体和类的区别
发布时间:2023/08/23 浏览次数:52 分类:C++
-
本文解释了 C++ 中结构体和类之间的区别。 本文是针对最新版本的 C++ 编写的; 旧版本中的结构和类之间存在更多限制和差异。在大多数情况下,结构与类非常相似,但差异很少。 让我们一一
C++ 中的类模板继承
发布时间:2023/08/23 浏览次数:142 分类:C++
-
本文将讨论 C++ 中最流行和最常用的方法之一(即类模板)。C++ 中模板的添加带来了一种新的编码范式,称为通用编程。 现在,这是 C++ 程序员工具包的一个重要元素,是许多标准库的基础,也
C++ 中的Point 和 Line 类
发布时间:2023/08/23 浏览次数:158 分类:C++
-
C++ 中的 Point 和 Line 类是可以表示点和线的主要数据类型。 它提供了操作点、条形和向量的方法。C++ 中 Point 和 Line 类的基本用例 Point 和 Line 类是 C++ 语言的基本部分。
在 C++ 中获取类名
发布时间:2023/08/23 浏览次数:100 分类:C++
-
在本文中,我们将学习如何使用 C++ 编程语言获取类名。C++ 类概述 在 C++ 中,一切都与类和对象相关,每个类和对象都有其特征和过程。
在 C++ 类中初始化静态变量
发布时间:2023/08/23 浏览次数:52 分类:C++
-
我们将在这篇短文中学习如何在 C++ 中初始化静态变量。在 C++ 中初始化静态变量 C++类中静态变量的初始化就是给静态变量赋值的过程。
C++ 中的垃圾收集
发布时间:2023/08/23 浏览次数:148 分类:C++
-
在本文中,我们将了解 C++ 中的垃圾收集。垃圾收集作为一种内存管理技术 垃圾收集是编程语言中使用的内存管理技术之一。 它是一种自动内存管理技术,作为许多编程语言的功能添加。
在 C++ 中分配和释放内存
发布时间:2023/08/23 浏览次数:70 分类:C++
-
C++ 编程语言提供了几个分配和释放内存的函数。 这些函数包括 malloc、calloc、realloc、free、new 和 delete。让我们从 new 和 delete 运算符开始。使用 new 和 delete 运算符分配和释放内存