关于用c语言实现矩阵的逆运算

线性代数矩阵的逆运算用c语言实现,下面是我的思路:

1. 既然是矩阵,那我就用二维数组去实现

2. 由线性代数的知识可知,逆矩阵可由伴随矩阵去除以他的行列式去得到逆矩阵

3. 计算行列式我就用转化为上三角行列式来做吧

以下是代码细节:

#include<stdio.h>
#include<math.h>

-->这边是要用到的模块

int main()
{   int n,i,j,k,x,y,p,q,P,Q;
    float a[100][100],b[100][100],c[100][100],A[100][100],beishu=1.0,hanglieshi=1.0,yuzishi=1.0,daishuyuzishi=1.0;
    printf("请输入矩阵的阶数");
    scanf("%d",&n);
    for (i=0;i<n;i++)
    {   printf("请输入第 %d 行的数据",i+1);
         for(j=0;j<n;j++)
            scanf("%f",&a[i][j]);
        printf("\n");
    }//    获取矩阵

-->这里我们先获取要被转化的矩阵

	for(j=0;j<n;j++)
    {   for(i=j+1;i<n;i++)        
        {   beishu=a[i][j]/a[j][j];
            for(k=j;k<n;k++)
                a[i][k]=a[i][k]-beishu*a[j][k];      
        }
    }//    转化为上三角行列式

-->这边我们把获取的矩阵作为行列式并且通过行变换去得到上三角行列式

	for(i=0;i<n;i++)
    {   for(j=0;j<n;j++)
    	{	if(i==j)
			hanglieshi=hanglieshi*a[i][j];
		}	
    }        
    printf("行列式值为%3f \n",hanglieshi);//    计算方阵的行列式

-->这边直接就通过主对角线去相乘去得到行列式的值了

	if(hanglieshi==0)
    {   printf("该矩阵不存在逆矩阵");
        return 0;
    }//    判断是否存在逆矩阵,不存在则退出

-->这边很重要,如果行列式值为0,那它就不存在逆矩阵了,所以我们要先判断它是否为0,为0,则退出。

	for(i=0;i<n;i++)
    {   p=i;
    	
        for(j=0;j<n;j++)
        {   q=j;
        	P=0;
            for(x=0,p=0;x<n-1;x++,p++)
            {   if(x==i&&P==0)
                {	p+=1;
					P+=1;
				}
				Q=0;
				for(y=0,q=0;y<n-1;y++,q++)
                {   
                    if(y==j&&Q==0)
                    {	q+=1;
						Q+=1;
					}    
                    A[x][y]=c[p][q];//    创建余子式bingo
            	}
        	}
			
			
			for(y=0;y<n-1;y++)
            {   for(x=y+1;x<n-1;x++)//    余子式每行执行
                {   beishu=A[x][y]/A[y][y];
                    for(k=y;k<n-1;k++)
                        A[x][k]=A[x][k]-beishu*A[y][k];//    余子式每个元素执行
                }
    		}//    余子式转化为上三角行列式
    		
            
            float yuzishi=1.0;
            for(x=0;x<n-1;x++)
            {   for(y=0;y<n-1;y++)
                {	if(x==y)
					{	
						yuzishi*=A[x][y];
					}
				}	
            }//    计算余子式
            
			  
            daishuyuzishi=pow((-1),(i+j))*yuzishi;
            b[i][j]=daishuyuzishi;
        }
    }//    计算伴随矩阵b

-->在这边我们通过一个新的二维数组A去获取他的余子式,这边就比较复杂了,思路在代码里备注了。然后我们同理运用上三角行列式去计算余子式的值,在将值乘上它的逆序数(i+j),这边我们用到了幂函数pow( )去计算其是奇排列还是偶排列

	for(i=0;i<n;i++)
    {   for(j=0;j<n;j++)
            b[i][j]/=hanglieshi;
    }//根据矩阵的逆=伴随矩阵/行列式运算得到逆矩阵

-->最后我们通过思路里面的公式(逆矩阵=伴随矩阵/行列式)去得到它的逆矩阵

	for(i=0;i<n;i++)
    {   printf("|");
        for(j=0;j<n;j++)
            printf(" %f ",b[i][j]);
        printf("|\n");
    }
    printf("\n");//    输出结果

-->最后我们通过二重循环去输出它的值

附:完整代码

#include<stdio.h>
#include<math.h>
int main()
{   int n,i,j,k,x,y,p,q,P,Q;
    float a[100][100],b[100][100],c[100][100],A[100][100],beishu=1.0,hanglieshi=1.0,yuzishi=1.0,daishuyuzishi=1.0;
    printf("请输入矩阵的阶数");
    scanf("%d",&n);
    for (i=0;i<n;i++)
    {   printf("请输入第 %d 行的数据",i+1);
         for(j=0;j<n;j++)
            scanf("%f",&a[i][j]);
        printf("\n");
    }//    获取矩阵
    
	
	for(i=0;i<n;i++)
    {   for(j=0;j<n;j++)
            c[i][j]=a[i][j];
    }//记录初始数据 
    
    
	for(j=0;j<n;j++)
    {   for(i=j+1;i<n;i++)        
        {   beishu=a[i][j]/a[j][j];
            for(k=j;k<n;k++)
                a[i][k]=a[i][k]-beishu*a[j][k];      
        }
    }//    转化为上三角行列式
    
    
	for(i=0;i<n;i++)
    {   for(j=0;j<n;j++)
    	{	if(i==j)
			hanglieshi=hanglieshi*a[i][j];
		}	
    }        
    printf("行列式值为%3f \n",hanglieshi);
    
    
	if(hanglieshi==0)
    {   printf("该矩阵不存在逆矩阵");
        return 0;
    }//    判断是否存在逆矩阵,不存在则退出
    
    
	for(i=0;i<n;i++)
    {   p=i;
    	
        for(j=0;j<n;j++)
        {   q=j;
        	P=0;
            for(x=0,p=0;x<n-1;x++,p++)
            {   if(x==i&&P==0)
                {	p+=1;
					P+=1;
				}
				Q=0;
				for(y=0,q=0;y<n-1;y++,q++)
                {   
                    if(y==j&&Q==0)
                    {	q+=1;
						Q+=1;
					}    
                    A[x][y]=c[p][q];//    创建余子式
            	}
        	}
			
			
			for(y=0;y<n-1;y++)
            {   for(x=y+1;x<n-1;x++)//    
                {   beishu=A[x][y]/A[y][y];
                    for(k=y;k<n-1;k++)
                        A[x][k]=A[x][k]-beishu*A[y][k];//   
                }
    		}//    余子式转化为上三角行列式
    		
            
            float yuzishi=1.0;
            for(x=0;x<n-1;x++)
            {   for(y=0;y<n-1;y++)
                {	if(x==y)
					{	
						yuzishi*=A[x][y];
					}
				}	
            }//    计算余子式
            
			  
            daishuyuzishi=pow((-1),(i+j))*yuzishi;
            b[i][j]=daishuyuzishi;
        }
    }//    计算伴随矩阵b
    
	
	for(i=0;i<n;i++)
    {   for(j=0;j<n;j++)
            b[i][j]/=hanglieshi;
    }//根据矩阵的逆=伴随矩阵/行列式运算得到逆矩阵
    
	
	for(i=0;i<n;i++)
    {   printf("|");
        for(j=0;j<n;j++)
            printf(" %f ",b[i][j]);
        printf("|\n");
    }
    printf("\n");//    输出结果
	
	
	return 0;
}        

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值