您的位置:首页 > 其它

C实现矩阵加减乘除运算

2016-04-29 14:01 501 查看

1、矩阵的加减乘除求逆运算的概念:

  (1)矩阵概念

有m n个数排列成一个m行n 列,并括以方括弧(或圆括弧)的数表称为m行n 列矩阵。

  (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 }


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: