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 }
4、参考:
(1)c编程,谭浩强
(2)博客:http://www.cnblogs.com/rollenholt/articles/2050662.html
来源:https://www.cnblogs.com/lpshou/archive/2012/05/08/2490278.html
