求逆矩阵程序(c语言)

这篇具有很好参考价值的文章主要介绍了求逆矩阵程序(c语言)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这个程序是大二上学期中秋前后完成的一个程序,是学完c语言和数据结构后写的第一个小项目

1.方法

用于转化的arr数组是一个行数为n(阶数),列数为2n的数组,前n列用于储存原数组,后n列在原数组转化的过程做相应的变换,最终左边n列化为最简型后,右边n列即为所求的逆矩阵

2.转化过程

2.1化为阶梯型

2.1.1 将原数组存入变换数组

//把矩阵存入新数组
    for (int i=0;i<n;i++)
        for (int j=0;j<n;j++)
            arr[i][j]=a[i][j];
    for (int i=0;i<n;i++){
        arr[i][i+n]=1;
    }

2.1.2 遍历每一行,将矩阵化为上三角型(阶梯型)

//遍历每一行,将矩阵化为上三角型(阶梯型) 
    for (int i=0;i<n-1;i++) { 
       	int m=0;
    	while(arr[i][i]==0&&m<n-1-i){//如果i行i列为0,将该行放到末尾,其他行前移一行 
    		//第i行的第i个为0,就将第i行放到末尾,其他行前移一行
    		for(int j=i;j<2*n;j++){
    			double temp=arr[i][j];
    			for(int k=i;k<n-1;k++){
    				arr[k][j]=arr[k+1][j];
				}
				arr[n-1][j]=temp;
			}
			m++;
			if(m==n-1-i&&arr[i][i]==0){//i行以后任意行第i列都为0:秩小于n无逆矩阵 
				printf("该矩阵无逆矩阵\n");
				return; 
			}
		}
		
		//将第i行的主元化为1 
		double flag=arr[i][i];flag:该行需要除以的数
        for (int j = i; j < 2 * n; j++) {
            arr[i][j] /= flag;
        }
         
        //将主元所在列其他元素化为0
        for (int k = i+1; k<n;k++){//第i+1行到第n行的第i个元素化为0
        	double sign=arr[k][i];

            for (int j=i;j<2*n;j++)
            arr[k][j]=arr[k][j]-arr[i][j]*sign;
        }
       
    }

2.1.3计数矩阵的秩(秩小于n没有逆矩阵)

//第n行第n个不为1:将该列除以该数,化为1;
	int result=(arr[n-1][n-1]==0);
    if(result){
    	printf("该矩阵无逆矩阵\n");
    	return;
    }
	else if(arr[n-1][n-1]!=1){

		double flag=arr[n-1][n-1];
		//将第n行第n个元素化为1
        for (int j = n-1; j < 2 * n; j++) {
            arr[n-1][j] /= flag;
        }
	}

2.2阶梯型化为最简型

//将阶梯型化为最简型,arr数组的11-20列即为逆矩阵 
	for(int i=n-1;i>0;i--){
		for(int k=i-1;k>=0;k--){
			double flag=arr[k][i];
			for(int j=0;j<2*n;j++){
				arr[k][j]=arr[k][j]-arr[i][j]*flag;
			}
		}
	}

2.3得到逆矩阵

//将逆矩阵存入a数组的第n到2n列 
	for(int i=0;i<n;i++){
		for(int j=n;j<2*n;j++){
			a[i][j]=arr[i][j];
		}
	}

3.运行截图

c语言矩阵求逆代码,矩阵,c语言

 c语言矩阵求逆代码,矩阵,c语言文章来源地址https://www.toymoban.com/news/detail-718755.html

4.完整代码

#include<stdio.h>
#define row 10
#define col 20

//初始化二维数组 
void init(double arr[row][col]){
	for(int i=0;i<10;i++){
		for(int j=0;j<20;j++){
			arr[i][j]=0;
		}
	}
}

/**********************show原矩阵******************************/
void showY(double arr[row][col],int n){//n为矩阵阶数 
	printf("---------------------------------------------\n"); 
    for (int i=0;i<n;i++){
        for (int j=0;j<n;j++){
        	printf("| %7.3lf\t",arr[i][j]);
        }
        printf("|\n\n");
    }
	printf("---------------------------------------------\n");
}

/**********************show逆矩阵******************************/
void showN(double arr[row][col],int n){
	printf("---------------------------------------------\n");
    for (int i=0;i<n;i++){
        for (int j=n;j<2*n;j++){
        	printf("| %7.3lf\t",arr[i][j]);
        }
        printf("|\n\n");
    }
	printf("---------------------------------------------\n");
}

/**********************化为逆矩阵******************************/
/*
a:输入输出的数组
arr:中间数组 
n:矩阵阶数
*/ 
void toInverse(double a[row][col],double arr[row][col],int n){
	printf("原矩阵:\n");
	showY(a,n);//输出原矩阵 
	
/*--------化为阶梯型--------*/

    //n为矩阵阶数
    //把矩阵存入新数组
    for (int i=0;i<n;i++)
        for (int j=0;j<n;j++)
            arr[i][j]=a[i][j];
    for (int i=0;i<n;i++){
        arr[i][i+n]=1;
    }
   
	//遍历每一行,将矩阵化为上三角型(阶梯型) 
    for (int i=0;i<n-1;i++) { 
       	int m=0;
    	while(arr[i][i]==0&&m<n-1-i){//如果i行i列为0,将该行放到末尾,其他行前移一行 
    		//第i行的第i个为0,就将第i行放到末尾,其他行前移一行
    		for(int j=i;j<2*n;j++){
    			double temp=arr[i][j];
    			for(int k=i;k<n-1;k++){
    				arr[k][j]=arr[k+1][j];
				}
				arr[n-1][j]=temp;
			}
			m++;
			if(m==n-1-i&&arr[i][i]==0){//i行以后任意行第i列都为0:秩小于n无逆矩阵 
				printf("该矩阵无逆矩阵\n");
				return; 
			}
		}
		
		//将第i行的主元化为1 
		double flag=arr[i][i];flag:该行需要除以的数
        for (int j = i; j < 2 * n; j++) {
            arr[i][j] /= flag;
        }
         
        //将主元所在列其他元素化为0
        for (int k = i+1; k<n;k++){//第i+1行到第n行的第i个元素化为0
        	double sign=arr[k][i];

            for (int j=i;j<2*n;j++)
            arr[k][j]=arr[k][j]-arr[i][j]*sign;
        }
       
    }
    
    
    
    //判断:阶梯型(n阶矩阵)第n行第n个为0:无逆矩阵; 
	//第n行第n个不为1:将该列除以该数,化为1;
	int result=(arr[n-1][n-1]==0);
    if(result){
    	printf("该矩阵无逆矩阵\n");
    	return;
    }
	else if(arr[n-1][n-1]!=1){

		double flag=arr[n-1][n-1];
		//将第n行第n个元素化为1
        for (int j = n-1; j < 2 * n; j++) {
            arr[n-1][j] /= flag;
        }
	}

	
/*--------求出逆矩阵--------*/
	//将阶梯型化为最简型,arr数组的11-20列即为逆矩阵 
	for(int i=n-1;i>0;i--){
		for(int k=i-1;k>=0;k--){
			double flag=arr[k][i];
			for(int j=0;j<2*n;j++){
				arr[k][j]=arr[k][j]-arr[i][j]*flag;
			}
		}
	}

	
	//将逆矩阵存入a数组的第n到2n列 
	for(int i=0;i<n;i++){
		for(int j=n;j<2*n;j++){
			a[i][j]=arr[i][j];
		}
	}

	
	//输出逆矩阵 
	printf("该矩阵的逆矩阵:\n");
	showN(a,n);//输出逆矩阵 
	//将矩阵存入文件 
	FILE* fp=NULL;
	fp=fopen("d:\\逆矩阵.txt","w");
	for(int i=0;i<n;i++){
		for(int j=n;j<2*n;j++){
			fprintf(fp,"%-14.3lf",arr[i][j]);
		}
		fprintf(fp,"\n");
	}
	
}

int main(){
	 int i,j,m,n; 
	 double arr[row][col];//开辟一个新数组以进行临时储存
	 init(arr);//初始化临时数组 
	 printf("请输入行数:");
	 scanf("%d",&m) ;
	 printf("请输入列数:");
	 scanf("%d",&n) ;
	 double a[row][col];//定义存储矩阵的数组
	 init(a);//初始化数组 
	 
 	 FILE* fp;
	 fp = fopen("d:\\data.txt", "rb");//打开文件,如果文件不存在,则结束程序
	 
	 if (fp == NULL)
	 {
	  printf("File not exist!");
	  return -1;
	 }
 
 //读取文件中的值,依次保存到二维数组的各元素中
 for (  i=0; i < m; i++)
 {
  for ( j=0; j < n; j++)
  {
   fscanf(fp, "%lf", &a[i][j]);//将文件中的值读到arr[][]数组中
  }
 }
 fclose(fp); 
 
 if(m==n){
 	toInverse(a,arr,n);
 }else{
 	printf("原矩阵:\n---------------------------------------------\n");
 	for(i=0;i<m;i++){
 		for(j=0;j<n;j++){
 			printf("| %7.3lf\t",a[i][j]);
		 }
		 printf("\n\n");
	 }
	 printf("---------------------------------------------\n");
 	printf("该矩阵无逆矩阵\n");
 } 
	return 0;
} 

到了这里,关于求逆矩阵程序(c语言)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【例题】利用伴随矩阵求逆矩阵

    【例1:同济线代习题二 9.1】求下列矩阵的逆矩阵: A = ( 1 2 2 5 ) boldsymbol{A} = begin{pmatrix} 1 2 \\\\ 2 5 end{pmatrix} A = ( 1 2 ​ 2 5 ​ ) 解答 因为 ∣ A ∣ = 5 − 4 = 1 ≠ 0 |boldsymbol{A}| = 5 - 4 = 1 ne 0 ∣ A ∣ = 5 − 4 = 1  = 0 ,所以 A boldsymbol{A} A 可逆。有 A − 1 = 1 ∣ A ∣ A ∗ = ( 5 − 2 −

    2023年04月11日
    浏览(41)
  • 3.3 伴随矩阵法求逆矩阵

      逆矩阵指的是另一个矩阵和自己相乘会变成单位矩阵,符号是右上角一个 − 1 -1 − 1 ,就是: A A − 1 = A − 1 A = I AA^{-1}=A^{-1}A=I A A − 1 = A − 1 A = I   例如以下两个矩阵就是互为逆矩阵: ( − 1 1 0 0 − 3 2 1 0 1 1 0 − 1 4 − 4 − 1 1 ) ( 1 1 1 1 2 1 1 1 − 1 2 1 1 3 2 1 2 ) = ( 1 0

    2024年02月09日
    浏览(52)
  • 分块矩阵求逆推导 + 矩阵反演公式由来

    引自知乎:https://www.zhihu.com/question/47760591 David Sun 大佬的回答 其实也可以正面刚,下面从正面刚一下: 其实正面刚比上一种解法更简单! PS:啥时候Markdown 编辑公式能像Mathtype 那么方便就好了,这样笔者也不用先在word中编辑一遍再贴个图过来了。 注意到第一种分块矩阵求逆

    2024年02月07日
    浏览(39)
  • Maple矩阵求逆

    如何使用Maple进行矩阵求逆 调用包 输入我想要的矩阵: 然后我使用了Inverse命令 结果并没有生成矩阵的逆。 查了一下说明手册加上 mod 好像也不行,而且手册的mod的参数我也没有看懂。 上网查了一下解决方法: 改用命令 MatrixInverse 就可以了。 完美解决!

    2024年02月11日
    浏览(83)
  • 分块对角矩阵的求逆

    分块对角矩阵的逆矩阵: [ A B C ⋱ ] − 1 = [ A − 1 B − 1 C − 1 ⋱ ] begin{bmatrix} mathbf{A} \\\\ mathbf{B} \\\\ mathbf{C} \\\\ ddots \\\\ end{bmatrix}^{-1} = begin{bmatrix} mathbf{A}^{-1} \\\\ mathbf{B}^{-1} \\\\ mathbf{C}^{-1} \\\\ ddots \\\\ end{bmatrix} ⎣ ⎢ ⎢ ⎡ ​ A ​ B ​ C ​ ⋱ ​ ⎦ ⎥ ⎥ ⎤ ​ − 1 = ⎣ ⎢ ⎢ ⎡

    2024年02月05日
    浏览(55)
  • 线性代数——求逆矩阵

    利用计算技巧凑出公式:两边加E、提取公因式、没有公因式可提时利用隐形的E=AA^(-1),因为E可看作系数1 主对角线有矩阵(副对角线是0矩阵),则分别逆后放在原位置 副对角线有矩阵(主对角线是0矩阵),则分别逆后互换位置

    2024年02月11日
    浏览(52)
  • 线性代数|例题:利用伴随矩阵求逆矩阵

    【例1:同济线代习题二 9.1】求下列矩阵的逆矩阵: A = ( 1 2 2 5 ) boldsymbol{A} = begin{pmatrix} 1 2 \\\\ 2 5 end{pmatrix} A = ( 1 2 ​ 2 5 ​ ) 解答 因为 ∣ A ∣ = 5 − 4 = 1 ≠ 0 |boldsymbol{A}| = 5 - 4 = 1 ne 0 ∣ A ∣ = 5 − 4 = 1  = 0 ,所以 A boldsymbol{A} A 可逆。有 A − 1 = 1 ∣ A ∣ A ∗ = ( 5 − 2 −

    2024年02月08日
    浏览(40)
  • 线代——求逆矩阵的快捷方法

    通常,求逆矩阵有两种方法: 方法一: 方法二: 但是,对于 特殊矩阵 ,如: A = [ a b c d ] A = begin{bmatrix} a b\\\\ c d end{bmatrix} A = [ a c ​ b d ​ ] ,其逆矩阵 A − 1 = 1 a d − b c [ d − b − c a ] A^{-1}=frac{1}{ad-bc}begin{bmatrix} d -b\\\\ -c a end{bmatrix} A − 1 = a d − b c 1 ​ [ d − c ​ − b a

    2023年04月08日
    浏览(36)
  • 矩阵求逆四种方法

    注: 用A、B表示某矩阵, E表示单位矩阵 用A­­ˊ¹表示A逆 用|A|表示A的行列式 A|E 表示拼接矩阵 先求A行列式结果,再求A伴随矩阵,最后再求A逆矩阵 |A| != 0 则 A­­ˊ¹=A*/|A| 注:图片中detA就是|A| A|E 初等变换- E|A­­ˊ¹ AB=E A­­ˊ¹=B 假设A、B都为可逆矩阵,则 B 0

    2024年02月08日
    浏览(30)
  • Excel·VBA矩阵、求逆矩阵、解线性方程组

    vba内置函数MInverse可以计算矩阵的逆矩阵,《Office VBA 参考-WorksheetFunction.MInverse 方法 (Excel)》 初等变换法代码思路 对于一个3x3矩阵(下图3x3红色部分)右侧扩充单位矩阵(下图3x3黑色部分),abc为行号 从左往右依次将1-3列非左对角线部分的数值消为0:下图“第1次”将第1列消

    2024年02月06日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包