科学计算离不开矩阵的运算。当然,python已经有非常好的现成的库:numpy。

我写这个矩阵类,并不是打算重新造一个轮子,只是作为一个练习,记录在此。

:这个类的函数还没全部实现,慢慢在完善吧。

全部代码:

 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实现的更多相关文章

  1. NPOI操作EXCEL(六)——矩阵类表头EXCEL模板的解析

    哈哈~~~很高兴还活着.总算加班加点的把最后一类EXCEL模板的解析做完了... 前面几篇文章介绍了博主最近项目中对于复杂excel表头的解析,写得不好,感谢园友们的支持~~~ 今天再简单讲诉一下另一 ...

  2. OpenGL矩阵类(C++)

    概述 创建&初始化 存取器 矩阵运算 变换函数 实例:模型视图矩阵 实例:投影矩阵 概述 OpenGL固定功能管线提供4个不同类型的矩阵(GL_MODELVIEW.GL_PROJECTION. ...

  3. [Java]编写自己的Matrix矩阵类

    用java实现一个简单的矩阵类,可以实现简单的矩阵计算功能. class Matrix 1.向量点乘 public static double dot(double[] x,double[] y) 2 ...

  4. 精解Mat类(一):基本数据类型-固定大小的 矩阵类(Matx) 向量类(Vector)

    一.基础数据类型 1.(基础)固定大小矩阵类 matx 说明: ①    基础矩阵是我个人增加的描述,相对于Mat矩阵类(存储图像信息的大矩阵)而言. ②    固定大小矩阵类必须在编译期间就知晓其维 ...

  5. OpenGL矩阵类(C++) 【转】

    http://www.cnblogs.com/hefee/p/3816727.html OpenGL矩阵类(C++) 概述 创建&初始化 存取器 矩阵运算 变换函数 实例:模型视图矩阵 实例: ...

  6. C++实现矩阵类和向量类

    C++期末作业内容,写完之后觉得过于臃肿,又重新搞了个新的.新的当作业交,旧的拿来给同学参考. [问题描述]请仿照复数类,设计一个矩阵类,设计矩阵类的构成元素 1.编写构造函数完成初始化 2.编写成员 ...

  7. leetcode-Spiral Matrix II 螺旋矩阵2之python大法好,四行就搞定,你敢信?

    Spiral Matrix II 螺旋矩阵 Given an integer n, generate a square matrix filled with elements from 1 to n2 ...

  8. 实用矩阵类(Matrix)(带测试)

    引言: 无意间看到国外一个网站写的Matrix类,实现了加减乘除基本运算以及各自的const版本等等,功能还算比较完善,,于是记录下来,以备后用: #ifndef MATRIX_H #define M ...

  9. python小知识-__call__和类装饰器的结合使用,数据描述符__get__\__set__\__delete__(描述符类是Python中一种用于储存类属性值的对象)

    class Decorator(): def __init__(self, f): print('run in init......') self.f = f def __call__(self, a ...

随机推荐

  1. Linux wget安装详解

    Wget是一个十分常用命令行下载工具,多数Linux发行版本都默认包含这个工具.如果没有安装可在 http://www.gnu.org/software/wget/wget.html下载最新版本,并使 ...

  2. Ajax 请求下载 Execl 文件

    通过Ajax请求下载Execl 的问题,掉进一个坑里半个多小时,特此来记录一下 . 起初  我误以为是后台的问题,然而调试了一下并不是这样的,也不会报错,且进入了success 函数. 以下的事件及请 ...

  3. 引用js文件

    在子模板里引用js文件的时候,需要把相应的.js文件放到static目录下,如引用static/jQuery/index.js文件: {% extends "base.html" ...

  4. Celery学习--- Celery 最佳实践之与django结合实现异步任务

    django 可以轻松跟celery结合实现异步任务,只需简单配置即可 同步执行和异步执行 注意:即使Celery的任务没有执行完成,但是已经创建了任务ID.可以利用前台的定时任务发送Ajax异步请求 ...

  5. python2.7与3.5共存windows平台安装

    文:铁乐与猫 2018-3-18 周日 01.首先是安装python2.7: 官网下载 https://www.python.org 点击安装包进行安装 可以选择自定义的路径 将默认打x的[add p ...

  6. Centos7 apache2.4.29(httpd) 安装

    重点参考文章:https://blog.csdn.net/MrDing991124/article/details/78829184  写的很详细了,自己按着改博文走了不遍,不错! 一.配置安装环境 ...

  7. zabbix日常监控项web(八)

    存在一种情况:nginx或者httpd服务本身运行正常,但是网页挂了,类似于网页被黑,或者40X之类的...:可以用zabbix把web页面访问也监控起来,第一时间得知web崩溃信息并做相应处理. 被 ...

  8. Mycat问题总结

    Mycat问题总结 一丶自增主键设置 Mycat提供了几种设置自增主键的方式 本地文件方式 数据库方式 服务器时间戳方式 分布式ZK-ID生成器 第一种和第二种只适合单点设置,对于集群不适用.第四种方 ...

  9. 如何让邮件营销平台成为EDM神器?

    任何一家做邮件营销的企业都希望自己的投入获得超乎想象的回报,出现打开率.点击率和伴随而来的成交量能够节节攀升的现象,这些数据我们当然可以通过监测各种平台的反馈而得到确切的报表.当然,作为邮件营销平台运 ...

  10. eclipse异常关闭,无法启动tomcat解决办法

    如果eclipse异常关闭,会出现以下 此时需要关闭javaw.exe即可,重新启动tomcat了. 关闭javaw.exe需要打开任务关闭器,选择详细信息,然后结束javaw.exe即可