c语言求矩阵逆矩阵用指针和动态分配内存,不能使用二重指针 代码
时间: 2024-05-08 20:20:12 浏览: 65
下面是使用指针和动态分配内存的方法求矩阵逆矩阵的 C 代码:
```c
#include <stdlib.h>
#include <stdio.h>
#define N 3 // 矩阵的维数
void print_matrix(double *matrix) {
int i, j;
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
printf("%lf ", *(matrix + i * N + j));
}
printf("\n");
}
}
// 交换矩阵的两行
void swap_rows(double *matrix, int i, int j) {
int k;
double temp;
for (k = 0; k < N; k++) {
temp = *(matrix + i * N + k);
*(matrix + i * N + k) = *(matrix + j * N + k);
*(matrix + j * N + k) = temp;
}
}
// 将矩阵的第i行乘以a
void multiply_row(double *matrix, int i, double a) {
int j;
for (j = 0; j < N; j++) {
*(matrix + i * N + j) *= a;
}
}
// 将矩阵的第j行加上第i行的a倍
void add_row(double *matrix, int i, int j, double a) {
int k;
for (k = 0; k < N; k++) {
*(matrix + j * N + k) += a * *(matrix + i * N + k);
}
}
// 求矩阵的逆矩阵
void inverse_matrix(double *matrix, double *inverse) {
int i, j, k;
double max_val, temp;
// 将单位矩阵存储到逆矩阵中
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
*(inverse + i * N + j) = (i == j ? 1.0 : 0.0);
}
}
// 矩阵的高斯消元
for (i = 0; i < N; i++) {
// 找到第i列中最大元素所在的行
max_val = *(matrix + i * N + i);
k = i;
for (j = i + 1; j < N; j++) {
if (*(matrix + j * N + i) > max_val) {
max_val = *(matrix + j * N + i);
k = j;
}
}
// 交换第i行和第k行
if (k != i) {
swap_rows(matrix, i, k);
swap_rows(inverse, i, k);
}
// 将第i行的主元素化为1
temp = *(matrix + i * N + i);
multiply_row(matrix, i, 1.0 / temp);
multiply_row(inverse, i, 1.0 / temp);
// 用第i行消去矩阵的其他行
for (j = 0; j < N; j++) {
if (j != i) {
add_row(matrix, i, j, -*(matrix + j * N + i));
add_row(inverse, i, j, -*(inverse + j * N + i));
}
}
}
}
int main() {
double *matrix, *inverse;
int i, j;
// 动态分配内存
matrix = (double *)malloc(N * N * sizeof(double));
inverse = (double *)malloc(N * N * sizeof(double));
// 输入原矩阵的元素
printf("输入原矩阵的元素:\n");
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
scanf("%lf", matrix + i * N + j);
}
}
// 求逆矩阵
inverse_matrix(matrix, inverse);
// 输出逆矩阵
printf("逆矩阵为:\n");
print_matrix(inverse);
// 释放内存
free(matrix);
free(inverse);
return 0;
}
```
该程序使用了指针和动态分配内存的技术,避免了使用二重指针来传递矩阵参数,在求解矩阵逆矩阵时,使用了高斯消元的方法。
阅读全文