ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-09-18 21:32:15  阅读:663  来源: 互联网

标签:求逆 tem 增广 实现 矩阵 int 高斯消


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

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

标签:求逆,tem,增广,实现,矩阵,int,高斯消
来源: https://blog.csdn.net/weixin_46207279/article/details/120374064

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有