矩陣的加、減、乘、除、求逆運算的實現


1、矩陣的加減乘除求逆運算的概念:

  (1)矩陣概念

      有m n個數排列成一個mn 列,並括以方括弧(或圓括弧)的數表稱為mn 列矩陣。

  (2)矩陣加法: 

   (3)矩陣乘法:

  (4)矩陣的求逆運算

  (5)矩陣的除法:

    分成兩種(1)A\B=inverse(A)*B  (2)B/A=B*inverse(A),理解上可能有誤,不過是按照這兩種方式來運算的。。

2、要求:

  要求很簡單:編寫一個實現矩陣(向量)的+ - * / 求逆運算的類(女友的一個作業題)

3、實現代碼

  

View Code
  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #define col 3
  4 #define row 3
  5 class matrix//類的定義
  6 {
  7 private:
  8     double m[col][row];//矩陣設置為私有的,
  9 public:
 10     matrix(){}//無參數的構造函數
 11     matrix(double a[col][row]);//有參數的構造函數
 12     matrix Add(matrix &b);//加法運算聲明
 13     matrix Sub(matrix &b);//減法運算聲明
 14     matrix Mul(matrix &b);//乘法運算聲明
 15     matrix Div(matrix &b);//除法運算聲明
 16     matrix Inverse();//求逆運算聲明
 17     ~matrix();//析構函數聲明
 18     void display();//顯示函數聲明
 19 };
 20 matrix::matrix(double a[col][row])//構造函數的定義
 21 {
 22     int i,j;
 23     for(i=0;i<col;i++)
 24         for(j=0;j<row;j++)
 25             m[i][j]=a[i][j];
 26 }
 27 matrix matrix::Add(matrix &b)//加法運算
 28 {
 29     int i,j;
 30     matrix*c=(matrix*)malloc(sizeof(matrix));
 31     for(i=0;i<col;i++)
 32         for(j=0;j<row;j++)
 33             c->m[i][j]=m[i][j]+b.m[i][j];
 34     return(*c);
 35 }
 36 matrix matrix::Sub(matrix &b)//減法運算
 37 {
 38     int i,j;
 39     matrix*c=(matrix*)malloc(sizeof(matrix));
 40     for(i=0;i<col;i++)
 41         for(j=0;j<row;j++)
 42             c->m[i][j]=m[i][j]-b.m[i][j];
 43     return *c;
 44 }
 45 matrix matrix::Mul(matrix &b)//乘法運算
 46 {
 47     int i,j,k;
 48     double sum=0;
 49     matrix*c=(matrix*)malloc(sizeof(matrix));
 50     for(i=0;i<col;i++)
 51     {
 52         for(j=0;j<row;j++)
 53         {
 54             for(k=0;k<row;k++)
 55                 sum+=m[i][k]*(b.m[k][j]);
 56             c->m[i][j]=sum;
 57             sum=0;
 58         }
 59     }
 60     return(*c);
 61 }
 62 matrix matrix::Div(matrix &b)//除法運算
 63 {
 64     //除法直接求解,參見主函數    
 65     matrix c;
 66     return(c);
 67 }
 68 matrix matrix::Inverse()//求逆運算
 69 {                       //參考博客:http://www.cnblogs.com/rollenholt/articles/2050662.html
 70     int i,j,k,M=col,N=2*col;
 71     double b[col][col*2];
 72     matrix*c=(matrix*)malloc(sizeof(matrix));
 73     for(i=0;i<M;i++)     //賦值        
 74         for(j=0;j<M;j++)                    
 75             b[i][j]=m[i][j];      
 76     for(i=0;i<M;i++)    //擴展      
 77         for(j=M;j<N;j++)        
 78         {             
 79             if(i==(j-M))                             
 80                 b[i][j]=1;                      
 81             else                           
 82                 b[i][j]=0;                     
 83         }  
 84     /***************下面進行求逆運算*********/
 85         for(i=0;i<M;i++)    
 86         {         
 87             if(b[i][i]==0)    
 88             {            
 89                 for(k=i;k<M;k++)             
 90                 {                 
 91                     if(b[k][i]!=0)            //作者的博客里面此處為b[k][k],貌似是不正確的,
 92                                               //因為這對比如說是{0,0,1,1,0,1,0,1,1}的矩陣就會判斷為不可逆,                    
 93                     {                         //而實際上該矩陣是可逆的,這里應該是作者筆誤,待進一步求證        
 94                         for(int j=0;j<N;j++)                     
 95                         {                         
 96                             double temp;                        
 97                             temp=b[i][j];                       
 98                             b[i][j]=b[k][j];                      
 99                             b[k][j]=temp;                    
100                         }                 
101                         break;                 
102                     }            
103                 }            
104                 if(k==M)
105                 {
106                     printf("該矩陣不可逆!\n"); 
107                     exit(0);
108                 }
109             }        
110             for(j=N-1;j>=i;j--)                  
111                 b[i][j]/=b[i][i];   
112             
113             for(k=0;k<M;k++)     
114             {         
115                 if(k!=i)      
116                 {              
117                     double temp=b[k][i];         
118                     for(j=0;j<N;j++)                              
119                         b[k][j]-=temp*b[i][j];             
120                 }       
121             }   
122         } 
123     /**********************導出結果******************/
124         for(i=0;i<M;i++)           
125             for(j=3;j<N;j++)        
126                 c->m[i][j-3]=b[i][j];    
127     return (*c);
128 }
129 
130 matrix::~matrix()
131 {}
132 void matrix::display()
133 {
134     int i,j;
135     for(i=0;i<col;i++)
136     {
137         for(j=0;j<row;j++)
138             printf("%f  ",m[i][j]);
139         printf("\n");
140     }
141 }
142 void main()
143 {
144     double a[3][3]={{1,0,1},{0,1,1},{0,3,1}};
145     double b[3][3]={{0,0,1},{1,0,1},{0,1,0}};
146     matrix ma(a),mb(b),mc;
147     int flag;
148     printf("----------------------------------------------------\n請選擇要進行的操作:\n1、打印\t2、加法");
149     printf("\t3、減法\n4、乘法\t5、除法\t6、求逆\n7、退出\n");
150     printf("-----------------------------------------------------\n");
151     scanf("%d",&flag);
152     while((flag==1)||(flag==2)||(flag==3)||(flag==4)||(flag==5)||(flag==6)||(flag==7))
153     {
154         if(flag==1)
155         {
156             printf("矩陣a為:\n");
157             ma.display();
158             printf("矩陣b為:\n");
159             mb.display();
160         }
161         if(flag==2)//矩陣加法運算
162         {
163             printf("矩陣加法運算結果:\n");
164             mc=ma.Add(mb);
165             mc.display();
166         }
167         else if(flag==3)//矩陣減法運算
168         {
169                 printf("矩陣減法運算結果:\n");
170             mc=ma.Sub(mb);
171             mc.display();
172         }
173         else if(flag==4)//矩陣乘法運算
174         {
175                 printf("矩陣乘法運算結果:\n");
176             mc=ma.Mul(mb);
177             mc.display();
178         }
179         else if(flag==5)//矩陣除法運算
180         {
181             printf("矩陣除法運算結果:\n");
182             printf("矩陣的除法分成兩類:\n 1、A\\B=inverse(A)*B \n 2、B/A=B*inverse(A)\n");
183             printf("采用第1類,則a\\b的結果為:\n");
184             mc=ma.Inverse();
185             mc=mc.Mul(mb);
186             mc.display();
187             printf("采用第2類,則a/b的結果為:\n");
188             mc=mb.Inverse();
189             mc=ma.Mul(mc);
190             mc.display();
191         }
192         else if (flag==6)//矩陣求逆運算
193         {
194             printf("矩陣a求逆運算結果為:\n");
195             mc=ma.Inverse();
196             mc.display();
197 
198             printf("矩陣b求逆運算結果為:\n");
199             mc=mb.Inverse();
200             mc.display();
201         }
202         else {exit(0);}
203     printf("----------------------------------------------------\n請選擇要進行的操作:\n1、打印\t2、加法");
204     printf("\t3、減法\n4、乘法\t5、除法\t6、求逆\n7、退出\n");
205     printf("-----------------------------------------------------\n");
206     scanf("%d",&flag);
207     }
208 }

4、參考:
  (1)c編程,譚浩強

  (2)博客:http://www.cnblogs.com/rollenholt/articles/2050662.html

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM