本文实例讲述了Python实现的矩阵类。分享给大家供大家参考,具体如下:

科学计算离不开矩阵的运算。当然,python已经有非常好的现成的库:numpy(numpy的简单安装与使用可参考https://www./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相关内容可查看本站专题:《Python数学运算技巧总结》、《Python正则表达式用法总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》
希望本文所述对大家Python程序设计有所帮助。
# Python
# 矩阵
# python简单实现矩阵的乘
# 加
# 转置和逆运算示例
# python 实现矩阵上下/左右翻转
# 转置的示例
# Python 实现交换矩阵的行示例
# python 实现一个反向单位矩阵示例
# 不匹配
# 新造
# 进阶
# 还没
# 相关内容
# 在此
# 数据结构
# 给大家
# 作为一个
# 非常好
# 更多关于
# 我写
# 所述
# 程序设计
# 值为
# 使用技巧
# 两行
# 若为
# 操作技巧
# 相减
相关文章:
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
建站之星展会模版如何一键下载生成?
建站之星各版本价格是多少?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?
建站DNS解析失败?如何正确配置域名服务器?
如何选择最佳自助建站系统?快速指南解析优劣
如何选择高效可靠的多用户建站源码资源?
济南专业网站制作公司,济南信息工程学校怎么样?
TestNG的testng.xml配置文件怎么写
建站之星安装步骤有哪些常见问题?
重庆市网站制作公司,重庆招聘网站哪个好?
如何通过老薛主机一键快速建站?
临沂网站制作企业,临沂第三中学官方网站?
建站之星后台管理如何实现高效配置?
在线制作视频网站免费,都有哪些好的动漫网站?
如何快速搭建高效WAP手机网站?
高防服务器如何保障网站安全无虞?
网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?
小型网站制作HTML,*游戏网站怎么搭建?
如何快速生成橙子建站落地页链接?
建站主机是否属于云主机类型?
建站之星安装路径如何正确选择及配置?
专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?
家庭服务器如何搭建个人网站?
如何选择域名并搭建高效网站?
如何在阿里云通过域名搭建网站?
长沙企业网站制作哪家好,长沙水业集团官方网站?
如何在阿里云完成域名注册与建站?
如何在橙子建站上传落地页?操作指南详解
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
如何通过网站建站时间优化SEO与用户体验?
定制建站价位费用解析与套餐推荐全攻略
零服务器AI建站解决方案:快速部署与云端平台低成本实践
网站制作大概多少钱一个,做一个平台网站大概多少钱?
如何挑选优质建站一级代理提升网站排名?
微信小程序 input输入框控件详解及实例(多种示例)
西安专业网站制作公司有哪些,陕西省建行官方网站?
如何在Windows环境下新建FTP站点并设置权限?
成都网站制作报价公司,成都工业用气开户费用?
如何挑选高效建站主机与优质域名?
如何在云虚拟主机上快速搭建个人网站?
建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析
javascript中的try catch异常捕获机制用法分析
如何在云主机上快速搭建多站点网站?
如何在建站之星绑定自定义域名?
如何在云主机上快速搭建网站?
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
如何解决ASP生成WAP建站中文乱码问题?
如何快速选择适合个人网站的云服务器配置?
*请认真填写需求信息,我们会在24小时内与您取得联系。