求矩阵的逆

  1 //***************************
  2 //求任何一个矩阵的逆矩阵
  3 //***************************
  4 #include <stdio.h>
  5 #include <malloc.h>
  6 
  7 void main( void )
  8 {
  9      float *buffer,*p;   //定义数组首地址指针变量
 10      short int row,num; //定义矩阵行数row及矩阵元素个数
 11      short int i,j;
 12      float determ;      //定义矩阵的行列式
 13 
 14      float comput_D(float *p,short int n);      //求矩阵的行列式
 15      float Creat_M(float *p, short int m,short int n,short int k); //求代数余子式
 16      void Print( float *p,short int n);     //打印n×n的矩阵
 17 
 18      printf("\nPlease input the number of rows: ");
 19      scanf("%d",&row);
 20     
 21      num=2 * row * row;
 22      buffer = (float *)calloc(num, sizeof(float));     //分配内存单元
 23 
 24      p=buffer;
 25      if(p != NULL)
 26      {
 27          for(i=0;i<row;i++)                   //输入各单元值
 28          {
 29              printf("Input the number of %d row ",i+1);
 30              for(j=0;j<row;j++)
 31              {
 32                  scanf("%f",p++);
 33              }
 34          }  
 35      }
 36      else
 37          printf( "Can't allocate memory\n" );
 38 
 39      printf("\nThe original matrix is:\n");
 40      Print(buffer,row);     //打印该矩阵
 41 
 42      determ=comput_D(buffer,row);     //求整个矩阵的行列式
 43      p=buffer + row * row;
 44      if (determ != 0)
 45      {
 46          for (i=0;i<row; i++)       //求逆矩阵
 47              for (j=0; j<row; j++)
 48                     *(p+j*row+i)=   Creat_M(buffer,i,j,row)/determ;    
 49             
 50          printf("The determinant is %G\n",determ);
 51 
 52          p=buffer + row * row;
 53          printf("\nThe inverse matrix is:\n"); 
 54          Print(p,row);     //打印该矩阵
 55      }
 56      else
 57          printf("The determnant is 0, and there is no inverse matrix !\n");
 58      free( buffer );
 59 }
 60 //--------------------------------------------------------
 61 //功能:求矩阵 n X n 的行列式
 62 //入口参数:矩阵首地址 p;矩阵行数 n
 63 //返回值:矩阵的行列式值
 64 //--------------------------------------------------------
 65 float comput_D(float *p,short int n)  
 66 {
 67      short int i,j,m;         //i--row; j--column
 68      short int lop=0;
 69      float result=0;
 70      float mid=1;
 71     
 72      if (n!=1)
 73      {
 74          lop=(n==2)?1:n;     //控制求和循环次数,若为2阶,则循环1次,否则为n次
 75 
 76          for(m=0;m<lop;m++)
 77          {
 78              mid=1;          //顺序求和
 79              for(i=0,j=m;i<n;i++,j++)
 80                  mid = mid * ( *(p+i*n+j%n) );
 81              result+=mid;
 82          }
 83 
 84          for(m=0;m<lop;m++)
 85          {                       
 86              mid=1;          //逆序相减
 87              for(i=0,j=n-1-m+n; i<n; i++,j--)
 88                  mid=mid * ( *(p+i*n+j%n));
 89              result-=mid;
 90          }
 91         }
 92      else result=*p;
 93      return(result);
 94 }
 95 //----------------------------------------------------
 96 //功能:求k×k矩阵中元素A(mn)的代数余子式
 97 //入口参数:k×k矩阵首地址;元素A的下标m,n; 矩阵行数 k
 98 //返回值: k×k矩阵中元素A(mn)的代数余子式
 99 //----------------------------------------------------
100 float Creat_M(float *p, short int m,short int n,short int k)
101 {
102      short int len;
103      short int i,j;
104      float mid_result=0;
105      short int quo=1;
106      float *p_creat,*p_mid;
107 
108      len=(k-1)*(k-1);
109      p_creat = (float *)calloc(len, sizeof(float));     //分配内存单元
110      p_mid=p_creat;
111      for(i=0;i<k;i++)
112          for(j=0;j<k;j++)
113          {
114              if (i!=m && j!=n)
115                  *p_mid++ =* (p+i*k+j);            
116          } 
117      //     Print(p_creat,k-1);
118      quo = (m + n) %2==0 ? 1:-1; 
119      mid_result = (float ) quo * comput_D(p_creat,k-1);
120      free(p_creat);
121      return(mid_result);
122 }
123 //-------------------------------------------
124 //功能:打印n×n的矩阵
125 //入口参数:n×n矩阵的首地址;该矩阵的行数 n
126 //返回值: 无
127 //-------------------------------------------
128 void Print( float *p,short int n)    
129 {
130      int i,j;
131      for (i=0;i<n;i++)
132      {
133          for (j=0; j<n;j++)
134              printf("%10G ",*p++);
135          printf("\n");
136      }
137      printf("--------------\n");
138 }

 

posted @ 2013-11-01 23:43  herizai007  阅读(1148)  评论(0编辑  收藏  举报