求矩阵逆的算法和程序_chenjieb520的空间_百度空间
/*
*姓名:chenjieb520
*班级:JMU JSJ0611
*时间:2009年08月11日
*/
#include <stdlib.h>
#include <stdio.h>
//矩阵的数据结构
typedef struct Matrix{
double **Ma;
int RowNum;
int ColNum;
}Matrix;
//创建矩阵
Matrix CreateMatrix()
{
int i,j;
Matrix M;
scanf("%d%d",&M.RowNum,&M.ColNum);
M.Ma=(double**)malloc(M.RowNum*sizeof(double*));
for (i=0;i<M.RowNum;i++)
{
   M.Ma[i]=(double*)malloc(M.ColNum*sizeof(double));
}
for (i=0;i<M.RowNum;i++)
{
   for (j=0;j<M.ColNum;j++)
   {
    scanf("%lf",&M.Ma[i][j]);
   }
}
return M;
}
//显示矩阵
void ShowMatrix(Matrix M)
{
for (int i=0;i<M.RowNum;i++)
{
   for (int j=0;j<M.ColNum;j++)
   {
    printf("%-.2lf ",M.Ma[i][j]);
   }
   printf("\n");
}
}
//求矩阵去掉某一行某一列后剩下的矩阵,其中r为行,c为列
Matrix leftMatrix(Matrix M,int r,int c)
{
Matrix M1;
M1.ColNum=M.ColNum-1;
M1.RowNum=M.RowNum-1;
M1.Ma=(double**)malloc(M1.RowNum*sizeof(double*));
for (int p=0;p<M1.RowNum;p++)
{
   M1.Ma[p]=(double*)malloc(M1.ColNum*sizeof(double));
}
int h=0;
for (int i=0;i<M.RowNum;i++)
{
   if (i==r)
   {
    continue;
   }
   for (int j=0,k=0;j<M.ColNum;j++)
   {
    if (j==c)
    {
     continue;
    }
    M1.Ma[h][k++]=M.Ma[i][j];
   }
   h++;
}
return M1;
}
//根据奇偶数给符号
int Sign(int n)
{
if (n%2==0)
{
   return 1;
}else
{
   return -1;
}
}
//求行列式的值
double Det(Matrix M)
{
double sum=0;
if (M.ColNum!=M.RowNum)
{
   return 99999;
}if (M.RowNum==1)
{
   sum=M.Ma[0][0];
}else if (M.RowNum==2)
{
   sum=M.Ma[0][0]*M.Ma[1][1]-M.Ma[0][1]*M.Ma[1][0];
}else
{
   for (int i=0;i<M.RowNum;i++)
   {
    sum+=Sign(0+i)*M.Ma[0][i]*Det(leftMatrix(M,0,i));
   }
}
return sum;
}
//矩阵乘以一个常数
Matrix MulConstanst(Matrix M,double k)
{
for (int i=0;i<M.RowNum;i++)
{
   for (int j=0;j<M.ColNum;j++)
   {
    M.Ma[i][j]=k*M.Ma[i][j];
   }
}
return M;
}
//求伴随矩阵
Matrix FollowMatrix(Matrix M)
{
Matrix M1;
M1.ColNum=M.ColNum;
M1.RowNum=M.RowNum;
M1.Ma=(double**)malloc(M1.RowNum*sizeof(double*));
for (int p=0;p<M1.RowNum;p++)
{
   M1.Ma[p]=(double*)malloc(M1.ColNum*sizeof(double));
}
for (int i=0;i<M.RowNum;i++)
{
   for (int j=0;j<M.ColNum;j++)
   {
    M1.Ma[j][i]=Sign(i+j)*Det(leftMatrix(M,i,j));
   }
}
return M1;
}
//求矩阵的逆(要先确保矩阵有逆存在)
Matrix InverseMatrix(Matrix M)
{
Matrix M1;
M1.RowNum=M.RowNum;
M1.ColNum=M.ColNum;
M1.Ma=(double**)malloc(M1.RowNum*sizeof(double*));
for (int p=0;p<M1.RowNum;p++)
{
   M1.Ma[p]=(double*)malloc(M1.ColNum*sizeof(double));
}
M1=MulConstanst(FollowMatrix(M),1.0/Det(M));
return M1;
}
//求矩阵的乘积,要确保可乘
Matrix MulMatrix(Matrix M1,Matrix M2)
{
Matrix M3;
M3.RowNum=0;
M3.ColNum=0;
if (M1.ColNum==M2.RowNum)
{
   int i,j,k;
   M3.RowNum=M1.RowNum;
   M3.ColNum=M2.ColNum;
   M3.Ma=(double**)malloc(M3.RowNum*sizeof(double*));
   for (int p=0;p<M3.ColNum;p++)
   {
    M3.Ma[p]=(double*)malloc(M3.ColNum*sizeof(double));
   }
   double sum=0;
   for (i=0;i<M1.RowNum;i++)
   {
    for (k=0;k<M2.ColNum;k++)
    {
     for (j=0;j<M2.RowNum;j++)
     {
      sum+=M1.Ma[i][j]*M2.Ma[j][k];
     }
     M3.Ma[i][k]=sum;
     sum=0;
    }
   }
}
return M3;
}
//主函数
int main()
{
Matrix M1,M2,M3;
M1=CreateMatrix();
ShowMatrix(M1);
printf("\n伴随矩阵为:\n");
M2=FollowMatrix(M1);
ShowMatrix(M2);
printf("\n逆矩阵为:\n");
M3=InverseMatrix(M1);
ShowMatrix(M3);
return 0;
}


郑重声明:资讯 【求矩阵逆的算法和程序_chenjieb520的空间_百度空间】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——