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

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

  

  

你可能感兴趣的:(实现)