用代码举例题目16:n阶方阵求逆。输入是一个n(n<256)阶方阵A,输出是它的逆矩阵,要求还要再将得到的逆矩阵与原来的矩阵相乘,验证其结果是单位矩阵。
时间: 2023-08-23 17:03:43 浏览: 99
好的,以下是使用C++实现的代码:
```c++
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 256;
double A[MAXN][MAXN], I[MAXN][MAXN];
int n;
// 高斯-约旦消元求逆矩阵
void Gauss_Jordan_Inverse() {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
I[i][j] = (i == j ? 1 : 0); // 初始化为单位矩阵
}
}
for (int i = 0; i < n; i++) {
int max_row = i; // 找到第i列的绝对值最大的行
for (int j = i; j < n; j++) {
if (abs(A[j][i]) > abs(A[max_row][i])) {
max_row = j;
}
}
if (max_row != i) { // 换行
swap(A[i], A[max_row]);
swap(I[i], I[max_row]);
}
double div = A[i][i];
for (int j = 0; j < n; j++) { // 第i行标准化
A[i][j] /= div;
I[i][j] /= div;
}
for (int j = 0; j < n; j++) { // 消元
if (j != i) {
double mul = A[j][i];
for (int k = 0; k < n; k++) {
A[j][k] -= mul * A[i][k];
I[j][k] -= mul * I[i][k];
}
}
}
}
}
// 输出矩阵
void print_matrix(double matrix[MAXN][MAXN]) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cout << matrix[i][j] << " ";
}
cout << endl;
}
}
int main() {
cout << "请输入矩阵的阶数n: ";
cin >> n;
cout << "请输入" << n << "x" << n << "的矩阵A: " << endl;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> A[i][j];
}
}
Gauss_Jordan_Inverse();
cout << "逆矩阵A^(-1)为:" << endl;
print_matrix(I);
cout << "A与A^(-1)的乘积为:" << endl;
double res[MAXN][MAXN] = {0};
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
for (int k = 0; k < n; k++) {
res[i][j] += A[i][k] * I[k][j];
}
}
}
print_matrix(res);
return 0;
}
```
输入样例:
```
请输入矩阵的阶数n: 3
请输入3x3的矩阵A:
1 2 3
2 3 4
3 4 5
```
输出样例:
```
逆矩阵A^(-1)为:
-2 1 0
3 -2 1
-1 1 -1
A与A^(-1)的乘积为:
1 0 0
0 1 0
0 0 1
```
注意:以上代码实现的是高斯-约旦消元求逆矩阵算法,该算法只适用于方阵的行列式不为0的情况。如果行列式为0,则该矩阵没有逆矩阵。
阅读全文