请帮我写一个高阶矩阵求逆程序,用c语言,使用给定数组和随机矩阵,使用高斯-约旦消元法来求解逆矩阵
时间: 2024-02-21 14:58:36 浏览: 138
好的,以下是一个基于高斯-约旦消元法的矩阵求逆的C语言程序。程序中使用了随机矩阵和给定的数组来测试求逆算法的正确性。
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 5 // 矩阵的大小
// 打印矩阵
void print_matrix(double **A, int n)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
printf("%f ", A[i][j]);
}
printf("\n");
}
}
// 高斯-约旦消元法求解逆矩阵
void invert(double **A, double **B, int n)
{
// 初始化单位矩阵
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
B[i][j] = (i == j) ? 1.0 : 0.0;
}
}
// 逐列消元
for (int k = 0; k < n; k++)
{
double pivot = A[k][k];
for (int j = 0; j < n; j++)
{
A[k][j] /= pivot;
B[k][j] /= pivot;
}
for (int i = 0; i < n; i++)
{
if (i != k)
{
double factor = A[i][k];
for (int j = 0; j < n; j++)
{
A[i][j] -= factor * A[k][j];
B[i][j] -= factor * B[k][j];
}
}
}
}
}
int main()
{
double **A = malloc(N * sizeof(double *));
double **B = malloc(N * sizeof(double *));
double *arr = malloc(N * N * sizeof(double)); // 用于存储随机矩阵
srand(time(NULL)); // 用系统时间初始化随机数生成器
// 初始化随机矩阵和数组
for (int i = 0; i < N; i++)
{
A[i] = malloc(N * sizeof(double));
B[i] = malloc(N * sizeof(double));
for (int j = 0; j < N; j++)
{
arr[i * N + j] = rand() % 10 + 1; // 生成1~10之间的随机数
A[i][j] = arr[i * N + j];
}
}
printf("随机矩阵为:\n");
print_matrix(A, N);
invert(A, B, N);
printf("逆矩阵为:\n");
print_matrix(B, N);
// 检查逆矩阵是否正确
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
double sum = 0.0;
for (int k = 0; k < N; k++)
{
sum += A[i][k] * B[k][j];
}
if (i == j && abs(sum - 1.0) > 1e-6)
{
printf("逆矩阵有误!\n");
break;
}
if (i != j && abs(sum) > 1e-6)
{
printf("逆矩阵有误!\n");
break;
}
}
}
// 释放内存
free(arr);
for (int i = 0; i < N; i++)
{
free(A[i]);
free(B[i]);
}
free(A);
free(B);
return 0;
}
```
注意:由于本程序使用了动态内存分配,因此必须在程序结束时手动释放内存,否则会导致内存泄漏。
阅读全文