欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++利用伴隨陣法實現(xiàn)矩陣求逆

 更新時間:2023年02月10日 14:45:13   作者:convective rain  
這篇文章主要為大家詳細(xì)介紹了C++如何利用伴隨陣法實現(xiàn)矩陣求逆,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)和借鑒價值,需要的可以參考一下

先來一段百度百科上的搜索結(jié)果:

伴隨陣法

定理:n階矩陣為可逆的充分必要條件是A非奇異,且:

其中,是|A|中元素的代數(shù)余子式;矩陣

稱為矩陣A的伴隨矩陣,記作A*,于是有

用此方法求逆矩陣,對于小型矩陣,特別是二階方陣求逆既方便、快陣,又有規(guī)律可循。因為二階可逆矩陣的伴隨矩陣,只需要將主對角線元素的位置互換,次對角線的元素變號即可。

若可逆矩陣是二階或二階以上矩陣,在求逆矩陣的過程中,需要求9個或9個以上代數(shù)余子式,還要計算一個三階或三階以上行列式,工作量大且中途難免出現(xiàn)符號及計算的差錯。對于求出的逆炬陣是否正確,一般要通過來檢驗。一旦發(fā)現(xiàn)錯誤,必須對每一計算逐一排查。

下面我們來設(shè)計一下伴隨陣法矩陣求逆的C++代碼。

首先,需要自定義一個矩陣類型

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

然后,設(shè)計矩陣數(shù)乘的代碼

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];  //當(dāng)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);  //伴隨矩陣與原矩陣存在轉(zhuǎn)置關(guān)系
	return B;
}

最后,把我原創(chuàng)的代碼分享給大家

#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];  //當(dāng)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);  //輸入階數(shù)
	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++利用伴隨陣法實現(xiàn)矩陣求逆的詳細(xì)內(nèi)容,更多關(guān)于C++矩陣求逆的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • linux中查詢dns示例

    linux中查詢dns示例

    這篇文章主要介紹了linux中查詢dns示例,需要的朋友可以參考下
    2014-04-04
  • C語言實現(xiàn)單元測試的示例詳解

    C語言實現(xiàn)單元測試的示例詳解

    單元測試(unit testing),是指對軟件中的最小可測試單元進(jìn)行檢查和驗證。這篇文章主要為大家介紹了C語言實現(xiàn)單元測試的方法,需要的可以參考一下
    2022-09-09
  • C++中不能被重載的運算符介紹

    C++中不能被重載的運算符介紹

    其實在C/C++ 里大多數(shù)運算符都可以在C++中被重載的。C 的運算符中只有 . 和 ?:(以及 sizeof,技術(shù)上可以看作一個運算符)不可以被重載
    2013-10-10
  • 解析設(shè)計模式中的Prototype原型模式及在C++中的使用

    解析設(shè)計模式中的Prototype原型模式及在C++中的使用

    這篇文章主要介紹了設(shè)計模式中的Prototype原型模式及在C++中的使用,需要的朋友可以參考下
    2016-03-03
  • 手動添加bits/stdc++.h到vs2017的詳細(xì)步驟

    手動添加bits/stdc++.h到vs2017的詳細(xì)步驟

    這篇文章主要介紹了手動添加bits/stdc++.h到vs2017的詳細(xì)步驟,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • 淺析C++元組tuple類型

    淺析C++元組tuple類型

    元組tuple是C++的一個模板,不同tuple類型的成員類型也不相同,但是一個tuple可以有任意數(shù)量的成員,今天通過本文給大家介紹C++元組tuple類型,感興趣的朋友一起看看吧
    2022-06-06
  • c++驗證哥德巴赫猜想

    c++驗證哥德巴赫猜想

    這篇文章主要介紹了c++驗證哥德巴赫猜想,哥德巴赫猜想就是任一大于2的偶數(shù),都可表示成兩個素數(shù)之和,需要的朋友可以參考下
    2014-04-04
  • 深入理解C語言的邏輯控制

    深入理解C語言的邏輯控制

    這篇文章主要介紹了C語言的邏輯控制,對C語言的邏輯控制有較為深入的剖析,需要的朋友可以參考下
    2014-07-07
  • C與匯編混合編程的實現(xiàn)示例

    C與匯編混合編程的實現(xiàn)示例

    本文主要介紹了C與匯編混合編程的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • 字符串的模式匹配詳解--BF算法與KMP算法

    字符串的模式匹配詳解--BF算法與KMP算法

    這篇文章記錄一下串里面的模式匹配,模式匹配,顧名思義就是給定一個被匹配的字符串,然后用一個字符串模式(模型)去匹配上面說的字符串,看后者是否在前者里面出現(xiàn)。常用的有2種算法可以實現(xiàn),下面我們來具體探討下
    2014-08-08

最新評論