c++实现任意矩阵求逆

  关于矩阵求逆记忆最深的就是在静宜大学参加程序比赛,这是遇见的第一个问题。刚才突然想到,于是又百度Google了一番,又有了下面这篇水文~

  矩阵的求逆按矩阵类型分2种,一种是方阵,一种就是任意的矩阵了。而求逆的过程,我们学过线数就知道,可以用行列变化,用伴随矩阵。两种思路的代码网上都有,这里贴出一部分c++写的代码,是针对任意矩阵的用伴随的方法(先求代数余子式)。完全的代码和矩阵类,等我会用Wordpress里的文件插入的时候立马补上。

  希望对大家有用,也提醒自己要认真学,哎,关于那个比赛就是个耻辱啊~悲剧啊~哈哈~以后详细来说。  

  //***************************
      //求任何一个矩阵的逆矩阵
      //***************************
      #include <stdio.h>
      #include <malloc.h>

      void main( void )
      {
           float *buffer,*p;   //定义数组首地址指针变量
           short int row,num; //定义矩阵行数row及矩阵元素个数
           short int i,j;
           float determ;      //定义矩阵的行列式

           float comput_D(float *p,short int n);      //求矩阵的行列式
           float Creat_M(float *p, short int m,short int n,short int k);
//求代数余子式
           void Print( float *p,short int n);     //打印n×n的矩阵

           printf(“/nPlease input the number of rows: “);
           scanf(“%d”,&row);
         
           num=2 * row * row;
           buffer = (float *)calloc(num, sizeof(float));     //分配内存单元

           p=buffer;
           if(p != NULL)
           {
               for(i=0;i<row;i++)                   //输入各单元值
               {
                   printf(“Input the number of %d row “,i+1);
                   for(j=0;j<row;j++)
                   {
                       scanf(“%f”,p++);
                   }
               }
           }
           else
               printf( “Can’t allocate memory/n” );

           printf(“/nThe original matrix is:/n”);
           Print(buffer,row);     //打印该矩阵

           determ=comput_D(buffer,row);     //求整个矩阵的行列式
           p=buffer + row * row;
           if (determ != 0)
           {
               for (i=0;i<row; i++)       //求逆矩阵
                   for (j=0; j<row; j++)
                          *(p+j*row+i)=   Creat_M(buffer,i,j,row)/determ;   
                 
               printf(“The determinant is %G/n”,determ);

               p=buffer + row * row;
               printf(“/nThe inverse matrix is:/n”);
               Print(p,row);     //打印该矩阵
           }
           else
               printf(“The determnant is 0, and there is no inverse matrix
!/n”);
           free( buffer );
      }
      //——————————————————–
      //功能:求矩阵 n X n 的行列式
      //入口参数:矩阵首地址 p;矩阵行数 n
      //返回值:矩阵的行列式值
      //——————————————————–
      float comput_D(float *p,short int n)
      {
           short int i,j,m;         //i–row; j–column
           short int lop=0;
           float result=0;
           float mid=1;
         
           if (n!=1)
           {
               lop=(n==2)?1:n;     //控制求和循环次数,若为2阶,则循环1次,否则为n次

               for(m=0;m<lop;m++)
               {
                   mid=1;          //顺序求和
                   for(i=0,j=m;i<n;i++,j++)
                       mid = mid * ( *(p+i*n+j%n) );
                   result+=mid;
               }

               for(m=0;m<lop;m++)
               {                      
                   mid=1;          //逆序相减
                   for(i=0,j=n-1-m+n; i<n; i++,j–)
                       mid=mid * ( *(p+i*n+j%n));
                   result-=mid;
               }
              }
           else result=*p;
           return(result);
      }
      //—————————————————-
      //功能:求k×k矩阵中元素A(mn)的代数余子式
      //入口参数:k×k矩阵首地址;元素A的下标m,n; 矩阵行数 k
      //返回值: k×k矩阵中元素A(mn)的代数余子式
      //—————————————————-
      float Creat_M(float *p, short int m,short int n,short int k)
      {
           short int len;
           short int i,j;
           float mid_result=0;
           short int quo=1;
           float *p_creat,*p_mid;

           len=(k-1)*(k-1);
           p_creat = (float *)calloc(len, sizeof(float));     //分配内存单元
           p_mid=p_creat;
           for(i=0;i<k;i++)
               for(j=0;j<k;j++)
               {
                   if (i!=m && j!=n)
                       *p_mid++ =* (p+i*k+j);           
               }
           //     Print(p_creat,k-1);
           quo = (m + n) %2==0 ? 1:-1;
           mid_result = (float ) quo * comput_D(p_creat,k-1);
           free(p_creat);
           return(mid_result);
      }
      //——————————————-
      //功能:打印n×n的矩阵
      //入口参数:n×n矩阵的首地址;该矩阵的行数 n
      //返回值: 无
      //——————————————-
      void Print( float *p,short int n)   
      {
           int i,j;
           for (i=0;i<n;i++)
           {
               for (j=0; j<n;j++)
                   printf(“%10G “,*p++);
               printf(“/n”);
           }
           printf(“————–/n”);
      }

超越C++原创文章,转载请注明来源并保留原文链接

本文链接:http://www.beyondc.cn/c-to-achieve-any-matrix-inversion.html

你可能感兴趣的:(C++,wordpress,buffer,input,float,Matrix)