加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

矩阵求逆运算    算法  (c语言完整程序)!

(2009-03-08 21:44:10)
标签:

矩阵求逆运算

it

这几天发了点时间做了个矩阵求逆运算的算法:(其中算法是网上找的),做了点补充,做这个的目的是马上有密码学的一个hill密码加密算法要用到的,有时间在把hill算法搞好来了,

该矩阵求逆运算 算法具体如下(仅供参考):

#include<stdio.h>
#include<malloc.h>
double *C,a[100];
double   *MatrixInver(double   A[],int   m,int   n)             //矩阵转置
        {
          int   i,j;
          double   *B=NULL;
          B=(double   *)malloc(m*n*sizeof(double));
       
          for(i=0;i <n;i++)
          for(j=0;j <m;j++)
          B[i*m+j]=A[j*n+i];
          return   B;
        }
double   Surplus(double   A[],int   m,int   n)                   //求矩阵行列式
        {
          int   i,j,k,p,r;
          double   X,temp=1,temp1=1,s=0,s1=0;
          if(n==2)
          {for(i=0;i <m;i++)
          for(j=0;j <n;j++)
          if((i+j)%2)   temp1*=A[i*n+j];
          else   temp*=A[i*n+j];
          X=temp-temp1;}
          else{
          for(k=0;k <n;k++)
          {for(i=0,j=k;i <m,j <n;i++,j++)
          temp*=A[i*n+j];
          if(m-i)
          {for(p=m-i,r=m-1;p> 0;p--,r--)
          temp*=A[r*n+p-1];}
          s+=temp;
          temp=1;
          }
          for(k=n-1;k>=0;k--)
          {for(i=0,j=k;i<m,j>=0;i++,j--)
          temp1*=A[i*n+j];
          if(m-i)
          {for(p=m-1,r=i;r <m;p--,r++)
          temp1*=A[r*n+p];}
          s1+=temp1;
          temp1=1;
          }
          X=s-s1;}
          return   X;
        }
double   *MatrixOpp(double   A[],int   m,int   n)               //矩阵求逆
        {
          int   i,j,x,y,k;
          double   *SP=NULL,*AB=NULL,*B=NULL,X;                  //*C;
          SP=(double   *)malloc(m*n*sizeof(double));
          AB=(double   *)malloc(m*n*sizeof(double));
          B=(double   *)malloc(m*n*sizeof(double));
          X=Surplus(A,m,n);
          X=1/X;
          for(i=0;i<m;i++)                               //求矩阵伴随矩阵
          for(j=0;j<n;j++)
          {
     for(k=0;k<m*n;k++)
              B[k]=A[k];                                 //B[]变成A[];
     {
     for(x=0;x<n;x++)
                  B[i*n+x]=0;
              for(y=0;y<m;y++)
                  B[m*y+j]=0;
          B[i*n+j]=1;
          SP[i*n+j]=Surplus(B,m,n);
          AB[i*n+j]=X*SP[i*n+j];
          }
          }
          C=MatrixInver(AB,m,n);                         //MatrixInver  求倒置
          return   C;
        }

int main()
{
 int m,n,i,j;
 while(scanf("%d%d",&m,&n)!=EOF)                               //求m*n阶矩阵的逆运算
 {
  for(i=0;i<m*n;i++)
    scanf("%lf",&a[i]);//printf("%lf\n",Surplus(a,m,n));           //输出行列式
     MatrixOpp(a, m,n);
  for(i=0;i<m*n;i++)
  {
   printf("%.5f ",C[i]);
   if(!((i+1)%m))
    printf("\n");
  }
 }
 return 0;
}

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有