代码实现矩阵求逆的三种方式(超详细、已实现)

一、使用高斯消元法来对矩阵求逆。

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博客_高斯消元法求逆矩阵

上一篇:从上到下打印二叉树,层序遍历


下一篇:冒泡排序