矩阵的加、减、乘、除、求逆运算的实现

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

  

  

posted @ 2012-05-08 16:19  lpshou  阅读(45922)  评论(3编辑  收藏  举报