用c语言写一段矩阵求逆的函数
时间: 2024-05-06 21:18:18 浏览: 186
好,以下是一段用C语言实现矩阵求逆的函数代码:
```
#include <stdio.h>
#include <stdlib.h>
#define N 3 // 矩阵维度
// 定义矩阵A和A的逆矩阵
double A[N][N], A_inv[N][N];
// 定义函数获取矩阵的伴随矩阵
void adjoint(double mat[N][N], double adj[N][N]) {
// 计算每一项的代数余子式
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
// 获取子矩阵
int sign = ((i + j) % 2 == 0) ? 1 : -1; // 符号判断
double tmp[N-1][N-1];
int ii = 0, jj = 0;
for (int m = 0; m < N; m++) {
if (m == i) continue;
for (int n = 0; n < N; n++) {
if (n == j) continue;
tmp[ii][jj] = mat[m][n];
jj++;
}
ii++;
jj = 0;
}
// 计算代数余子式
double cofactor = sign * (tmp[0][0] * tmp[1][1] - tmp[0][1] * tmp[1][0]);
adj[j][i] = cofactor;
}
}
}
// 定义函数计算矩阵的行列式
double determinant(double mat[N][N]) {
double det = 0.0;
if (N == 1) {
det = mat[0][0];
} else if (N == 2) {
det = mat[0][0] * mat[1][1] - mat[0][1] * mat[1][0];
} else {
int sign = 1;
for (int i = 0; i < N; i++) {
double tmp[N-1][N-1];
int ii = 0, jj = 0;
for (int m = 0; m < N; m++) {
if (m == 0) continue;
for (int n = 0; n < N; n++) {
if (n == i) continue;
tmp[ii][jj] = mat[m][n];
jj++;
}
ii++;
jj = 0;
}
det += sign * mat[0][i] * determinant(tmp);
sign = -sign;
}
}
return det;
}
// 定义函数计算矩阵的逆
int inverse(double mat[N][N], double inv[N][N]) {
// 计算矩阵行列式
double det = determinant(mat);
if (det == 0.0) {
printf("无法求逆矩阵!\n");
return 0;
}
// 获取伴随矩阵
double adj[N][N];
adjoint(mat, adj);
// 计算逆矩阵
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
inv[i][j] = adj[i][j] / det;
}
}
return 1;
}
int main() {
// 初始化输入矩阵A
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
printf("请输入矩阵A[%d][%d]的值:", i+1, j+1);
scanf("%lf", &A[i][j]);
}
}
// 计算逆矩阵
inverse(A, A_inv);
// 打印输入矩阵A和逆矩阵A_inv
printf("矩阵A:\n");
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
printf("%8.2f ", A[i][j]);
}
printf("\n");
}
printf("矩阵A的逆:\n");
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
printf("%8.2f ", A_inv[i][j]);
}
printf("\n");
}
return 0;
}
```
这段程序通过定义一个矩阵结构体,实现了对矩阵求逆的操作。具体实现过程参见程序注释。
阅读全文