设为首页 收藏本站
查看: 1061|回复: 0

[经验分享] 矩阵类的python实现

[复制链接]
发表于 2015-12-1 08:41:00 | 显示全部楼层 |阅读模式
  
  科学计算离不开矩阵的运算。当然,python已经有非常好的现成的库:numpy。
  
  我写这个矩阵类,并不是打算重新造一个轮子,只是作为一个练习,记录在此。
  
  :这个类的函数还没全部实现,慢慢在完善吧。
  
  全部代码:
  



  1 import copy
  2
  3 class Matrix:
  4     '''矩阵类'''
  5     def __init__(self, row, column, fill=0.0):
  6         self.shape = (row, column)
  7         self.row = row
  8         self.column = column
  9         self._matrix = [[fill]*column for i in range(row)]
10         
11     # 返回元素m(i, j)的值:  m[i, j]
12     def __getitem__(self, index):
13         if isinstance(index, int):
14             return self._matrix[index-1]
15         elif isinstance(index, tuple):
16             return self._matrix[index[0]-1][index[1]-1]
17
18     # 设置元素m(i,j)的值为s:  m[i, j] = s
19     def __setitem__(self, index, value):
20         if isinstance(index, int):
21             self._matrix[index-1] = copy.deepcopy(value)
22         elif isinstance(index, tuple):
23             self._matrix[index[0]-1][index[1]-1] = value
24         
25     def __eq__(self, N):
26         '''相等'''
27         # A == B
28         assert isinstance(N, Matrix), "类型不匹配,不能比较"
29         return N.shape == self.shape  # 比较维度,可以修改为别的
30     
31     def __add__(self, N):
32         '''加法'''
33         # A + B
34         assert N.shape == self.shape, "维度不匹配,不能相加"
35         M = Matrix(self.row, self.column)
36         for r in range(self.row):
37             for c in range(self.column):
38                 M[r, c] = self[r, c] + N[r, c]
39         return M
40     
41     def __sub__(self, N):
42         '''减法'''
43         # A - B
44         assert N.shape == self.shape, "维度不匹配,不能相减"
45         M = Matrix(self.row, self.column)
46         for r in range(self.row):
47             for c in range(self.column):
48                 M[r, c] = self[r, c] - N[r, c]
49         return M
50     
51     def __mul__(self, N):
52         '''乘法'''
53         # A * B (或:A * 2.0)
54         if isinstance(N, int) or isinstance(N,float):
55             M = Matrix(self.row, self.column)
56             for r in range(self.row):
57                 for c in range(self.column):
58                     M[r, c] = self[r, c]*N
59         else:
60             assert N.row == self.column, "维度不匹配,不能相乘"
61             M = Matrix(self.row, N.column)
62             for r in range(self.row):
63                 for c in range(N.column):
64                     sum = 0
65                     for k in range(self.column):
66                         sum += self[r, k] * N[k, r]
67                     M[r, c] = sum
68         return M
69     
70     def __div__(self, N):
71         '''除法'''
72         # A / B
73         pass
74     def __pow__(self, k):
75         '''乘方'''
76         # A**k
77         assert self.row == self.column, "不是方阵,不能乘方"
78         M = copy.deepcopy(self)
79         for i in range(k):
80            M = M * self
81         return M
82
83     def rank(self):
84         '''矩阵的秩'''
85         pass
86     
87     def trace(self):
88         '''矩阵的迹'''
89         pass
90     
91     def adjoint(self):
92         '''伴随矩阵'''
93         pass
94     
95     def invert(self):
96         '''逆矩阵'''
97         assert self.row == self.column, "不是方阵"
98         M = Matrix(self.row, self.column*2)
99         I = self.identity() # 单位矩阵
100         I.show()#############################
101         
102         # 拼接
103         for r in range(1,M.row+1):
104             temp = self[r]
105             temp.extend(I[r])
106             M[r] = copy.deepcopy(temp)
107         M.show()#############################
108         
109         # 初等行变换
110         for r in range(1, M.row+1):
111             # 本行首元素(M[r, r])若为 0,则向下交换最近的当前列元素非零的行
112             if M[r, r] == 0:
113                 for rr in range(r+1, M.row+1):
114                     if M[rr, r] != 0:
115                         M[r],M[rr] = M[rr],M[r] # 交换两行
116                     break
117
118             assert M[r, r] != 0, '矩阵不可逆'
119            
120             # 本行首元素(M[r, r])化为 1
121             temp = M[r,r] # 缓存
122             for c in range(r, M.column+1):
123                 M[r, c] /= temp
124                 print("M[{0}, {1}] /=  {2}".format(r,c,temp))
125             M.show()
126                 
127             # 本列上、下方的所有元素化为 0
128             for rr in range(1, M.row+1):
129                 temp = M[rr, r] # 缓存
130                 for c in range(r, M.column+1):
131                     if rr == r:
132                         continue
133                     M[rr, c] -= temp * M[r, c]
134                     print("M[{0}, {1}] -= {2} * M[{3}, {1}]".format(rr, c, temp,r))
135                 M.show()   
136            
137         # 截取逆矩阵
138         N = Matrix(self.row,self.column)
139         for r in range(1,self.row+1):
140             N[r] = M[r][self.row:]
141         return N
142            
143         
144     def jieti(self):
145         '''行简化阶梯矩阵'''
146         pass
147         
148         
149     def transpose(self):
150         '''转置'''
151         M = Matrix(self.column, self.row)
152         for r in range(self.column):
153             for c in range(self.row):
154                 M[r, c] = self[c, r]
155         return M
156     
157     def cofactor(self, row, column):
158         '''代数余子式(用于行列式展开)'''
159         assert self.row == self.column, "不是方阵,无法计算代数余子式"
160         assert self.row >= 3, "至少是3*3阶方阵"
161         assert row <= self.row and column <= self.column, "下标超出范围"
162         M = Matrix(self.column-1, self.row-1)
163         for r in range(self.row):
164             if r == row:
165                 continue
166             for c in range(self.column):
167                 if c == column:
168                     continue
169                 rr = r-1 if r > row else r
170                 cc = c-1 if c > column else c
171                 M[rr, cc] = self[r, c]
172         return M
173     
174     def det(self):
175         '''计算行列式(determinant)'''
176         assert self.row == self.column,"非行列式,不能计算"
177         if self.shape == (2,2):
178             return self[1,1]*self[2,2]-self[1,2]*self[2,1]
179         else:
180             sum = 0.0
181             for c in range(self.column+1):
182                 sum += (-1)**(c+1)*self[1,c]*self.cofactor(1,c).det()
183             return sum
184     
185     def zeros(self):
186         '''全零矩阵'''
187         M = Matrix(self.column, self.row, fill=0.0)
188         return M
189     
190     def ones(self):
191         '''全1矩阵'''
192         M = Matrix(self.column, self.row, fill=1.0)
193         return M
194     
195     def identity(self):
196         '''单位矩阵'''
197         assert self.row == self.column, "非n*n矩阵,无单位矩阵"
198         M = Matrix(self.column, self.row)
199         for r in range(self.row):
200             for c in range(self.column):
201                 M[r, c] = 1.0 if r == c else 0.0
202         return M
203     
204     def show(self):
205         '''打印矩阵'''
206         for r in range(self.row):
207             for c in range(self.column):
208                 print(self[r+1, c+1],end='  ')
209             print()
210     
211
212 if __name__ == '__main__':
213     m = Matrix(3,3,fill=2.0)
214     n = Matrix(3,3,fill=3.5)
215
216     m[1] = [1.,1.,2.]
217     m[2] = [1.,2.,1.]
218     m[3] = [2.,1.,1.]
219     
220     p = m * n
221     q = m*2.1
222     r = m**3
223     #r.show()
224     #q.show()
225     #print(p[1,1])
226     
227     #r = m.invert()
228     #s = r*m
229     
230     print()
231     m.show()
232     print()
233     #r.show()
234     print()   
235     #s.show()
236     print()
237     print(m.det())
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-145626-1-1.html 上篇帖子: python利用utf-8编码判断中文英文字符(转) 下篇帖子: [leetcode]Reverse Nodes in k-Group @ Python
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表