矩阵类的python实现

简介: 科学计算离不开矩阵的运算。当然,python已经有非常好的现成的库:numpy。   我写这个矩阵类,并不是打算重新造一个轮子,只是作为一个练习,记录在此。   注:这个类的函数还没全部实现,慢慢在完善吧。

 

科学计算离不开矩阵的运算。当然,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())

 

目录
相关文章
|
14天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
14天前
|
程序员 开发者 Python
Python网络编程基础(Socket编程) 错误处理和异常处理的最佳实践
【4月更文挑战第11天】在网络编程中,错误处理和异常管理不仅是为了程序的健壮性,也是为了提供清晰的用户反馈以及优雅的故障恢复。在前面的章节中,我们讨论了如何使用`try-except`语句来处理网络错误。现在,我们将深入探讨错误处理和异常处理的最佳实践。
|
17天前
|
缓存 监控 Python
解密Python中的装饰器:优雅而强大的编程利器
Python中的装饰器是一种强大而又优雅的编程工具,它能够在不改变原有代码结构的情况下,为函数或类添加新的功能和行为。本文将深入解析Python装饰器的原理、用法和实际应用,帮助读者更好地理解和利用这一技术,提升代码的可维护性和可扩展性。
|
1月前
|
编译器 测试技术 C++
【Python 基础教程 01 全面介绍】 Python编程基础全攻略:一文掌握Python语法精髓,从C/C++ 角度学习Python的差异
【Python 基础教程 01 全面介绍】 Python编程基础全攻略:一文掌握Python语法精髓,从C/C++ 角度学习Python的差异
165 0
|
6天前
|
安全 数据处理 开发者
《Python 简易速速上手小册》第7章:高级 Python 编程(2024 最新版)
《Python 简易速速上手小册》第7章:高级 Python 编程(2024 最新版)
19 1
|
6天前
|
人工智能 数据挖掘 程序员
《Python 简易速速上手小册》第1章:Python 编程入门(2024 最新版)
《Python 简易速速上手小册》第1章:Python 编程入门(2024 最新版)
35 0
|
7天前
|
API Python
Python模块化编程:面试题深度解析
【4月更文挑战第14天】了解Python模块化编程对于构建大型项目至关重要,它涉及代码组织、复用和维护。本文深入探讨了模块、包、导入机制、命名空间和作用域等基础概念,并列举了面试中常见的模块导入混乱、不适当星号导入等问题,强调了避免循环依赖、合理使用`__init__.py`以及理解模块作用域的重要性。掌握这些知识将有助于在面试中自信应对模块化编程的相关挑战。
21 0
|
8天前
|
Python
Python金融应用编程:衍生品定价和套期保值的随机过程
Python金融应用编程:衍生品定价和套期保值的随机过程
23 0
|
8天前
|
Python
python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)(上)
python面型对象编程进阶(继承、多态、私有化、异常捕获、类属性和类方法)(上)
50 0

热门文章

最新文章