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

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

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

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

全部代码:

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定义一个1xn矩阵_Python实现的矩阵类实例相关推荐

  1. python定义一个空数组_python数组 1_python 数组最后一个元素_python定义一个空数组 - 云+社区 - 腾讯云...

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 感悟: 1.python列表操作里不允许变量类型的指针2.case1类似于冒泡排 ...

  2. python定义一个整数变量_python循环定义多个变量的实例分析

    python循环定义多个变量方法 我们可能会时长碰到这样一个场景,计算得到一个非固定值,需要根据这个值定义相同数量个变量. 实现方式的核心是exec函数,exec函数可以执行我们输入的代码字符串. e ...

  3. python定义一个求和函数_Python定义函数实现累计求和操作

    一.使用三种方法实现0-n累加求和 定义函数分别使用while循环.for循环.递归函数实现对0-n的累加求和 1.使用while循环 定义一个累加求和函数sum1(n),函数代码如下: 2.使用 f ...

  4. python定义一个整数变量_Python变量与常量

    1.什么是变量 a=1,其中 a 就是变量名称,1 就是它的值.在程序运行过程中,变量的值一般都会发生改变,内存中会专门开辟一段空间,用来存放变量的值,而变量名将指向这个值所在的内存空间.与变量相对的 ...

  5. python定义一个空数组_python如何创建空数组?

    Python创建空数组的三种方式: 1.numpy指定形状为0 实际上,empty生成的数组当然可以为空,只要我们指定了相应的形状.例如,如果我们传入数组的形状参数为(0,3),则可以生成目标空数组: ...

  6. python定义一个全局字典_Python字典操作详细介绍及字典内建方法分享

    创建 方法一: >>> dict1 = {} >>> dict2 = {'name': 'earth', 'port': 80} >>> dict ...

  7. python定义一个字符串变量_python怎么创建字符串变量

    python怎么创建字符串变量? 字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 创建字符串很简单,只要为变量分配一个值即可.例如:var1 = 'He ...

  8. python定义一个空变量_Python 学习笔记 - Python 变量

    Python 变量 创建变量 变量是存储值的容器.Python 里没有专门的命令来声明变量.当把一个值赋给一个变量时,它就被创建了.如: x= 8 name = "空悟孙" 变量不 ...

  9. python定义一个空数组_python – 在numpy数组中设置空值

    如何基于条件使numpy数组中的某些值为空? 我不明白为什么我最终得到0而不是null或空值不满足条件- b是一个用0和1值填充的numpy数组,c是另一个完全填充的numpy数组.所有阵列都是71x ...

最新文章

  1. 【javascript】深入理解对象
  2. TEASOFT辅助服务程序UDPCopy 功能介绍
  3. 网络推广外包之前企业网站如何看待当下网页设计趋势?
  4. init tarray 太大_[NOIP 2001提高组T4]Car的旅行路线
  5. ARM开发板上iconv_open(utf-8, gb2312) 调用失败的解决方法(转)
  6. 现代软件工程 团队作业 - 软件分析和用户需求调查 (2013 - 2014)
  7. Python这11个奇特的库,你都认识吗?你还知道哪些?
  8. 最简单的视音频播放示例6:OpenGL播放YUV420P(通过Texture,使用Shader)
  9. 怎么用计算机输出手机的密码,手机连接wifi后怎么看密码?手机连接wifi后看密码的方法-太平洋IT百科...
  10. cocos2dx打飞机项目笔记一:项目结构介绍
  11. Hardware概述
  12. java弹幕爬取,手把手教你爬取B站弹幕(超详细)!
  13. 数字签名(Digital Signature)
  14. 苏嵌实训——day7
  15. the计算机科学全球大学排名,2020THE计算机科学专业排名发布,内地60所大学入榜,清华全球15...
  16. Andersen Global与斯德哥尔摩律所合作,扩大瑞典业务版图
  17. 三级管的饱和区和MOS管的饱和区
  18. sonar问题:Font declarations should contain at least one generic font family
  19. select UNION ALL 合并两张表数据
  20. 标准流程Invalid bound statement (not found)出现原因和最特殊的解决方法

热门文章

  1. Html5新增表单属性
  2. 鸿蒙系统首批更新名单,鸿蒙系统首批升级名单是哪些-鸿蒙系统首批升级名单详细介绍 - 系统家园...
  3. 三点滑动平均法怎么计算的_孔径千分尺怎么用,能看懂吗?
  4. java 进程撤销_2020-08-12 如何优雅关闭java进程
  5. CodeFirst的EF6迁移和时间戳错误
  6. 具有多个Join和选定列的示例LINQ
  7. Angular 9.0.0 版本已发布!
  8. Android 10如何增强移动安全性
  9. mysql sync es 异步双写_mysql数据同步es方案思考
  10. python从文件中读取数据时出现错误_python-从文件中读取数据