C++利用伴随阵法实现矩阵求逆

 更新时间:2023年02月10日 14:45:13   作者:convective rain  
这篇文章主要为大家详细介绍了C++如何利用伴随阵法实现矩阵求逆,文中的示例代码讲解详细,具有一定的学习和借鉴价值,需要的可以参考一下

先来一段百度百科上的搜索结果:

伴随阵法

定理:n阶矩阵为可逆的充分必要条件是A非奇异,且:

其中,是|A|中元素的代数余子式;矩阵

称为矩阵A的伴随矩阵,记作A*,于是有

用此方法求逆矩阵,对于小型矩阵,特别是二阶方阵求逆既方便、快阵,又有规律可循。因为二阶可逆矩阵的伴随矩阵,只需要将主对角线元素的位置互换,次对角线的元素变号即可。

若可逆矩阵是二阶或二阶以上矩阵,在求逆矩阵的过程中,需要求9个或9个以上代数余子式,还要计算一个三阶或三阶以上行列式,工作量大且中途难免出现符号及计算的差错。对于求出的逆炬阵是否正确,一般要通过来检验。一旦发现错误,必须对每一计算逐一排查。

下面我们来设计一下伴随阵法矩阵求逆的C++代码。

首先,需要自定义一个矩阵类型

#include<vector>
typedef vector<double> vec;
typedef vector<vec> mat;

然后,设计矩阵数乘的代码

mat num_mul(mat A, double num) {
	mat B(A.size(), vec(A[0].size()));
	for(int i = 0; i < B.size(); i++)
		for(int j = 0; j < B[0].size(); j++)
			B[i][j] = A[i][j] * num;
	return B;
}

再写一段计算伴随矩阵的代码

mat cutoff(mat A, int i, int j) {  //切割,划去第1行第i列
	mat B(A.size() - 1, vec(A.size() - 1));
	for(int c = 0; c < B.size(); c++)
		for(int r = 0; r < B.size(); r++)
			B[c][r] = A[c + (c >= i)][r + (r >= j)];
	return B;
}

double det(mat A) {
	if(A.size() == 1)
		return A[0][0];  //当A为一阶矩阵时,直接返回A中唯一的元素
	double ans = 0;
	for(int j = 0; j < A.size(); j++)
		ans += A[0][j] * det(cutoff(A, 0, j)) * (j % 2 ? -1 : 1);
	return ans;
}

mat company_mat(mat A) {
	mat B(A.size(), vec(A.size()));
	for(int i = 0; i < B.size(); i++)
		for(int j = 0; j < B.size(); j++)
			B[j][i] = det(cutoff(A, i, j)) * ((i + j) % 2 ? -1 : 1);  //伴随矩阵与原矩阵存在转置关系
	return B;
}

最后,把我原创的代码分享给大家

#include<iostream>
#include<vector>
using namespace std;
typedef vector<double> vec;
typedef vector<vec> mat;

mat cutoff(mat A, int i, int j) {  //切割,划去第1行第i列
	mat B(A.size() - 1, vec(A.size() - 1));
	for(int c = 0; c < B.size(); c++)
		for(int r = 0; r < B.size(); r++)
			B[c][r] = A[c + (c >= i)][r + (r >= j)];
	return B;
}

double det(mat A) {
	if(A.size() == 1)
		return A[0][0];  //当A为一阶矩阵时,直接返回A中唯一的元素
	double ans = 0;
	for(int j = 0; j < A.size(); j++)
		ans += A[0][j] * det(cutoff(A, 0, j)) * (j % 2 ? -1 : 1);
	return ans;
}

mat company_mat(mat A) {
	mat B(A.size(), vec(A.size()));
	for(int i = 0; i < B.size(); i++)
		for(int j = 0; j < B.size(); j++)
			B[j][i] = det(cutoff(A, i, j)) * ((i + j) % 2 ? -1 : 1);
	return B;
}

void output(mat A) {
	cout << "......\n";
	for(int i = 0; i < A.size(); i++) {
		for(int j = 0; j < A[0].size(); j++)
			printf("%.2lf ", A[i][j]);
		cout << '\n';
	}
	cout << "......\n";
}

mat num_mul(mat A, double num) {
	mat B(A.size(), vec(A[0].size()));
	for(int i = 0; i < B.size(); i++)
		for(int j = 0; j < B[0].size(); j++)
			B[i][j] = A[i][j] * num;
	return B;
}

int main() {
	int n;
	scanf("%d", &n);  //输入阶数
	if(n == 0)
		return 0;
	mat A(n, vec(n));
	for(int i = 0; i < n; i++)
		for(int j = 0; j < n; j++)
			scanf("%lf", &A[i][j]);  //输入A各行各列的元素
	mat B = num_mul(company_mat(A), 1 / det(A));
	output(B);
	return 0;
}

以上就是C++利用伴随阵法实现矩阵求逆的详细内容,更多关于C++矩阵求逆的资料请关注脚本之家其它相关文章!

相关文章

  • linux中查询dns示例

    linux中查询dns示例

    这篇文章主要介绍了linux中查询dns示例,需要的朋友可以参考下
    2014-04-04
  • C语言实现单元测试的示例详解

    C语言实现单元测试的示例详解

    单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。这篇文章主要为大家介绍了C语言实现单元测试的方法,需要的可以参考一下
    2022-09-09
  • C++中不能被重载的运算符介绍

    C++中不能被重载的运算符介绍

    其实在C/C++ 里大多数运算符都可以在C++中被重载的。C 的运算符中只有 . 和 ?:(以及 sizeof,技术上可以看作一个运算符)不可以被重载
    2013-10-10
  • 解析设计模式中的Prototype原型模式及在C++中的使用

    解析设计模式中的Prototype原型模式及在C++中的使用

    这篇文章主要介绍了设计模式中的Prototype原型模式及在C++中的使用,需要的朋友可以参考下
    2016-03-03
  • 手动添加bits/stdc++.h到vs2017的详细步骤

    手动添加bits/stdc++.h到vs2017的详细步骤

    这篇文章主要介绍了手动添加bits/stdc++.h到vs2017的详细步骤,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • 浅析C++元组tuple类型

    浅析C++元组tuple类型

    元组tuple是C++的一个模板,不同tuple类型的成员类型也不相同,但是一个tuple可以有任意数量的成员,今天通过本文给大家介绍C++元组tuple类型,感兴趣的朋友一起看看吧
    2022-06-06
  • c++验证哥德巴赫猜想

    c++验证哥德巴赫猜想

    这篇文章主要介绍了c++验证哥德巴赫猜想,哥德巴赫猜想就是任一大于2的偶数,都可表示成两个素数之和,需要的朋友可以参考下
    2014-04-04
  • 深入理解C语言的逻辑控制

    深入理解C语言的逻辑控制

    这篇文章主要介绍了C语言的逻辑控制,对C语言的逻辑控制有较为深入的剖析,需要的朋友可以参考下
    2014-07-07
  • C与汇编混合编程的实现示例

    C与汇编混合编程的实现示例

    本文主要介绍了C与汇编混合编程的实现示例,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07
  • 字符串的模式匹配详解--BF算法与KMP算法

    字符串的模式匹配详解--BF算法与KMP算法

    这篇文章记录一下串里面的模式匹配,模式匹配,顾名思义就是给定一个被匹配的字符串,然后用一个字符串模式(模型)去匹配上面说的字符串,看后者是否在前者里面出现。常用的有2种算法可以实现,下面我们来具体探讨下
    2014-08-08

最新评论