一、使用高斯消元法来对矩阵求逆。
1、从上往下做行变换,使增广矩阵W 的前一部分的方阵变为一个上三角矩阵
2、从下往上做行变换,使增广矩阵W的前一部分变成一个对角矩阵
3、每一行乘以一个系数使增广矩阵的前一部分变为单位矩阵
4、经过变换后的增广矩阵的后一部分即为所求矩阵的逆矩阵
#include <stdio.h>
#include <stdlib.h>
#include<time.h>
#define N 5
typedef int(*R)[N];
R transpose(int arr[][N], int n) ;
void main(){
int arr[N][N];
int i, j, k;
float W[N][2*N];
float tem_1, tem_2, tem_3;
transpose(arr, N); // 对20x20矩阵进行 -20 ~ 20 随机初始化
printf("初始矩阵为:\n");
for(i=0;i<N;i++){
for(j=0;j<N;j++){
printf("%4d", arr[i][j]);
}
printf("\n");
}
for(i = 0;i < N; i++){
for(j = 0;j < 2 * N; j++){
if(j<N){
W[i][j] = (float) arr[i][j];
}
else{
W[i][j] = (float) (j-N == i ? 1:0);
}
}
}
printf("*********************\n");
for(i=0;i<N;i++){
for(j=0;j<2*N;j++){
printf("%8.2f", W[i][j]);
}
printf("\n");
}
for(i=0;i<N;i++)
{
// 判断矩阵第一行第一列的元素是否为0,若为0,继续判断第二行第一列元素,直到不为0,将其加到第一行
if( ((int) W[i][i]) == 0)
{
printf("这些语句执行了吗");
for(j=i+1;j<N;j++)
{
if( ((int) W[j][i]) != 0 ) break;
}
if(j == N)
{
printf("这个矩阵不能求逆");
printf("这个地方还要改改");
break;
}
//将前面为0的行加上后面某一行
for(k=0;k<2*N;k++)
{
W[i][k] += W[j][k];
}
}
//将前面行首位元素置1
tem_1 = W[i][i];
for(j=0;j<2*N;j++)
{
W[i][j] = W[i][j] / tem_1;
}
//将后面所有行首位元素置为0
for(j=i+1;j<N;j++)
{
tem_2 = W[j][i];
for(k=i;k<2*N;k++)
{
W[j][k] = W[j][k] - tem_2 * W[i][k];
}
}
}
for(i=N-1;i>=0;i--)
{
for(j=i-1;j>=0;j--)
{
tem_3 = W[j][i];
for(k=i;k<2*N;k++)
{
W[j][k] = W[j][k] - tem_3*W[i][k];
}
}
}
printf("*********************\n");
for(i=0;i<N;i++){
for(j=0;j<2*N;j++){
printf("%8.2f", W[i][j]);
}
printf("\n");
}
}
// 定义一个结构体来对二维数组进行随机初始化
typedef int(*R)[N];
R transpose(int arr[][N], int n)
{
int i, j, tem;
srand((unsigned int)time(NULL));
for (i = 0; i < n; i++){
for (j = 0; j < n; j++)
{
tem = rand()%40 - 20;
arr[i][j] = tem;
}
}
return arr;
}
结果显示如下图:
参考链接:矩阵求逆-高斯消元法介绍及其实现_Your Blog-CSDN博客_高斯消元法求逆矩阵