Python实现的矩阵类实例
作者:罗兵 发布时间:2023-08-13 07:52:09
标签:Python,矩阵
本文实例讲述了Python实现的矩阵类。分享给大家供大家参考,具体如下:
科学计算离不开矩阵的运算。当然,python已经有非常好的现成的库:numpy(numpy的简单安装与使用可参考https://www.jb51.net/article/66236.htm)。
我写这个矩阵类,并不是打算重新造一个轮子,只是作为一个练习,记录在此。
注:这个类的函数还没全部实现,慢慢在完善吧。
全部代码:
import copy
class Matrix:
'''矩阵类'''
def __init__(self, row, column, fill=0.0):
self.shape = (row, column)
self.row = row
self.column = column
self._matrix = [[fill]*column for i in range(row)]
# 返回元素m(i, j)的值: m[i, j]
def __getitem__(self, index):
if isinstance(index, int):
return self._matrix[index-1]
elif isinstance(index, tuple):
return self._matrix[index[0]-1][index[1]-1]
# 设置元素m(i,j)的值为s: m[i, j] = s
def __setitem__(self, index, value):
if isinstance(index, int):
self._matrix[index-1] = copy.deepcopy(value)
elif isinstance(index, tuple):
self._matrix[index[0]-1][index[1]-1] = value
def __eq__(self, N):
'''相等'''
# A == B
assert isinstance(N, Matrix), "类型不匹配,不能比较"
return N.shape == self.shape # 比较维度,可以修改为别的
def __add__(self, N):
'''加法'''
# A + B
assert N.shape == self.shape, "维度不匹配,不能相加"
M = Matrix(self.row, self.column)
for r in range(self.row):
for c in range(self.column):
M[r, c] = self[r, c] + N[r, c]
return M
def __sub__(self, N):
'''减法'''
# A - B
assert N.shape == self.shape, "维度不匹配,不能相减"
M = Matrix(self.row, self.column)
for r in range(self.row):
for c in range(self.column):
M[r, c] = self[r, c] - N[r, c]
return M
def __mul__(self, N):
'''乘法'''
# A * B (或:A * 2.0)
if isinstance(N, int) or isinstance(N,float):
M = Matrix(self.row, self.column)
for r in range(self.row):
for c in range(self.column):
M[r, c] = self[r, c]*N
else:
assert N.row == self.column, "维度不匹配,不能相乘"
M = Matrix(self.row, N.column)
for r in range(self.row):
for c in range(N.column):
sum = 0
for k in range(self.column):
sum += self[r, k] * N[k, r]
M[r, c] = sum
return M
def __div__(self, N):
'''除法'''
# A / B
pass
def __pow__(self, k):
'''乘方'''
# A**k
assert self.row == self.column, "不是方阵,不能乘方"
M = copy.deepcopy(self)
for i in range(k):
M = M * self
return M
def rank(self):
'''矩阵的秩'''
pass
def trace(self):
'''矩阵的迹'''
pass
def adjoint(self):
'''伴随矩阵'''
pass
def invert(self):
'''逆矩阵'''
assert self.row == self.column, "不是方阵"
M = Matrix(self.row, self.column*2)
I = self.identity() # 单位矩阵
I.show()#############################
# 拼接
for r in range(1,M.row+1):
temp = self[r]
temp.extend(I[r])
M[r] = copy.deepcopy(temp)
M.show()#############################
# 初等行变换
for r in range(1, M.row+1):
# 本行首元素(M[r, r])若为 0,则向下交换最近的当前列元素非零的行
if M[r, r] == 0:
for rr in range(r+1, M.row+1):
if M[rr, r] != 0:
M[r],M[rr] = M[rr],M[r] # 交换两行
break
assert M[r, r] != 0, '矩阵不可逆'
# 本行首元素(M[r, r])化为 1
temp = M[r,r] # 缓存
for c in range(r, M.column+1):
M[r, c] /= temp
print("M[{0}, {1}] /= {2}".format(r,c,temp))
M.show()
# 本列上、下方的所有元素化为 0
for rr in range(1, M.row+1):
temp = M[rr, r] # 缓存
for c in range(r, M.column+1):
if rr == r:
continue
M[rr, c] -= temp * M[r, c]
print("M[{0}, {1}] -= {2} * M[{3}, {1}]".format(rr, c, temp,r))
M.show()
# 截取逆矩阵
N = Matrix(self.row,self.column)
for r in range(1,self.row+1):
N[r] = M[r][self.row:]
return N
def jieti(self):
'''行简化阶梯矩阵'''
pass
def transpose(self):
'''转置'''
M = Matrix(self.column, self.row)
for r in range(self.column):
for c in range(self.row):
M[r, c] = self[c, r]
return M
def cofactor(self, row, column):
'''代数余子式(用于行列式展开)'''
assert self.row == self.column, "不是方阵,无法计算代数余子式"
assert self.row >= 3, "至少是3*3阶方阵"
assert row <= self.row and column <= self.column, "下标超出范围"
M = Matrix(self.column-1, self.row-1)
for r in range(self.row):
if r == row:
continue
for c in range(self.column):
if c == column:
continue
rr = r-1 if r > row else r
cc = c-1 if c > column else c
M[rr, cc] = self[r, c]
return M
def det(self):
'''计算行列式(determinant)'''
assert self.row == self.column,"非行列式,不能计算"
if self.shape == (2,2):
return self[1,1]*self[2,2]-self[1,2]*self[2,1]
else:
sum = 0.0
for c in range(self.column+1):
sum += (-1)**(c+1)*self[1,c]*self.cofactor(1,c).det()
return sum
def zeros(self):
'''全零矩阵'''
M = Matrix(self.column, self.row, fill=0.0)
return M
def ones(self):
'''全1矩阵'''
M = Matrix(self.column, self.row, fill=1.0)
return M
def identity(self):
'''单位矩阵'''
assert self.row == self.column, "非n*n矩阵,无单位矩阵"
M = Matrix(self.column, self.row)
for r in range(self.row):
for c in range(self.column):
M[r, c] = 1.0 if r == c else 0.0
return M
def show(self):
'''打印矩阵'''
for r in range(self.row):
for c in range(self.column):
print(self[r+1, c+1],end=' ')
print()
if __name__ == '__main__':
m = Matrix(3,3,fill=2.0)
n = Matrix(3,3,fill=3.5)
m[1] = [1.,1.,2.]
m[2] = [1.,2.,1.]
m[3] = [2.,1.,1.]
p = m * n
q = m*2.1
r = m**3
#r.show()
#q.show()
#print(p[1,1])
#r = m.invert()
#s = r*m
print()
m.show()
print()
#r.show()
print()
#s.show()
print()
print(m.det())
希望本文所述对大家Python程序设计有所帮助。
来源:http://www.cnblogs.com/hhh5460/p/4314231.html
0
投稿
猜你喜欢
- 就来总结一下简单的东西备注:一下的方法都是包裹在一个EventUtil对象里面的,直接采用对象字面量定义方法了。。。①添加事件方法addHa
- 一、多线程同步由于CPython的python解释器在单线程模式下执行,所以导致python的多线程在很多的时候并不能很好地发挥多核cpu的
- output输出打包后的代码,配置如何输出和输出位置在webpack.config中output包含以下属性:path:代码打包后要输出的位
- 本文实例为大家分享了vuex实现购物车功能的具体代码,供大家参考,具体内容如下先看效果:代码:<template> <di
- pyc 文件的触发上一篇文章我们介绍了字节码,当时提到,py 文件在执行的时候会先被编译成 PyCodeObject 对象,并且该对象还会被
- 引子闭包是有权访问另一个函数作用域中的变量的函数。闭包是javascript中很难理解的部分,很多高级的应用都依靠闭包来实现的,我们先来看下
- 使用场景我有两个GPU卡。我希望我两个GPU能并行运行两个网络模型。代码错误代码1:#对于0号GPUos.environ['CUDA
- 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理以下文章来源于菜J学Py
- 多子图figure是绘制对象(可以理解为一个空白的画布),一个figure对象可以包含多个Axes子图,一个Axes是一个绘图区域,不加设置
- 1,登录后默认自动选中My Objects 默认情况下,PLSQL Developer登录后,Brower里会选择All objects,如
- 1.Anaconda 安装python3.6conda create -n match python=3.6Python版本默认安装是 3.
- if语句>>通用格式if语句一般形式如下:if <test1>: <statements1>elif &
- 摘要:面部识别技术的应用越来越广泛,它广泛应用于安全系统、人机交互、社交媒体、医疗保健等领域。本文介绍了基于Python的人脸识别技术,包括
- 前言日常工作中,在不刷新页面的情况下发送消息并获得即时响应是我们认为理所当然的事情。但在过去,启用实时功能对开发人员来说是一个真正的挑战。开
- pytest官方文档fixtures调用既然fixtures是给执行测试做准备工作的,那么pytest如何知道哪些测试函数 或者 fixtu
- 测试环境Python 3.6.2Win 10 内存 8G,CPU I5 1.6 GHz背景描述这个作品来源于一个日志解析工具的开发,这个开发
- <html> <head> <meta http-equiv="Content-Langu
- 一、准备工作1、确保jdk已安装成功,并且jdk版本选用1.7以上版本2、准备一台新的主机mysql_mycat放到master的前面做代理
- 折线图是数据分析中非常常用的图形。其中,折线图主要是以折线的上升或下降来表示统计数量的增减变化的统计图。用于分析自变量和因变量之间的趋势关系
- 垃圾评论,垃圾留言,人见人憎,用了验证码,效果也好不到哪里去,还影响用户体验。有的网站甚至不惜牺牲用户体验,而构造强悍的惨不忍睹的超级验证码