矩阵类的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())

 

目录
相关文章
|
18天前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
17天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
5天前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
98 80
|
24天前
|
存储 索引 Python
Python编程数据结构的深入理解
深入理解 Python 中的数据结构是提高编程能力的重要途径。通过合理选择和使用数据结构,可以提高程序的效率和质量
134 59
|
4天前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
24 2
|
17天前
|
小程序 开发者 Python
探索Python编程:从基础到实战
本文将引导你走进Python编程的世界,从基础语法开始,逐步深入到实战项目。我们将一起探讨如何在编程中发挥创意,解决问题,并分享一些实用的技巧和心得。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考。让我们一起开启Python编程的探索之旅吧!
41 10
|
21天前
|
机器学习/深度学习 人工智能 Java
Python 语言:强大、灵活与高效的编程之选
本文全面介绍了 Python 编程语言,涵盖其历史、特点、应用领域及核心概念。从 1989 年由 Guido van Rossum 创立至今,Python 凭借简洁的语法和强大的功能,成为数据科学、AI、Web 开发等领域的首选语言。文章还详细探讨了 Python 的语法基础、数据结构、面向对象编程等内容,旨在帮助读者深入了解并有效利用 Python 进行编程。
|
19天前
|
机器学习/深度学习 人工智能 数据挖掘
探索Python编程的奥秘
在数字世界的海洋中,Python如同一艘灵活的帆船,引领着无数探险者穿梭于数据的波涛之中。本文将带你领略Python编程的魅力,从基础语法到实际应用,一步步揭开Python的神秘面纱。
37 12
|
18天前
|
IDE 程序员 开发工具
Python编程入门:打造你的第一个程序
迈出编程的第一步,就像在未知的海洋中航行。本文是你启航的指南针,带你了解Python这门语言的魅力所在,并手把手教你构建第一个属于自己的程序。从安装环境到编写代码,我们将一步步走过这段旅程。准备好了吗?让我们开始吧!

热门文章

最新文章