迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C++ >

C++ 中的逆矩阵

作者:迹忆客 最近更新:2023/08/24 浏览次数:

本文将解释矩阵求逆及其使用 C++ 的实现。 为了方便理解C++的实现,我们首先需要理解矩阵逆的概念。


矩阵的逆

求矩阵的逆矩阵需要三个步骤。 下面给出步骤的解释。

  • 第一步,计算给定矩阵的行列式。
  • 在第二步中,如果行列式不等于零,则计算给定矩阵的伴随。
  • 最后,将步骤2中得到的矩阵乘以1/行列式。

矩阵逆的数学公式

令 S 为 3 x 3 矩阵。 那么求其倒数的公式如下。

下面是一个用 C++ 求 3x3 阶矩阵的逆矩阵的程序。 为了简单起见,我们使用数组来存储矩阵。

仅当矩阵非奇异时,程序才会找到矩阵的逆。 我们可以通过以下性质来验证我们的答案。

S.S1=I

这里 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 文件

下一篇:没有了

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

用 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 运算符分配和释放内存

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便