Python实现的矩阵类实例


Posted in Python onAugust 22, 2017

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

科学计算离不开矩阵的运算。当然,python已经有非常好的现成的库:numpy(numpy的简单安装与使用可参考https://3water.com/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安装官方whl包和tar.gz包的方法(推荐)
Jun 04 Python
Python矩阵常见运算操作实例总结
Sep 29 Python
python使用标准库根据进程名如何获取进程的pid详解
Oct 31 Python
符合语言习惯的 Python 优雅编程技巧【推荐】
Sep 25 Python
Window环境下Scrapy开发环境搭建
Nov 18 Python
Python 虚拟空间的使用代码详解
Jun 10 Python
python抓取多种类型的页面方法实例
Nov 20 Python
安装完Python包然后找不到模块的解决步骤
Feb 13 Python
Python之Matplotlib文字与注释的使用方法
Jun 18 Python
pycharm 实现光标快速移动到括号外或行尾的操作
Feb 05 Python
pytorch fine-tune 预训练的模型操作
Jun 03 Python
Python FuzzyWuzzy实现模糊匹配
Apr 28 Python
Python实现图片转字符画的示例
Aug 22 #Python
利用aardio给python编写图形界面
Aug 21 #Python
Python实现图片转字符画的示例代码
Aug 21 #Python
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
Aug 21 #Python
Python编程实现微信企业号文本消息推送功能示例
Aug 21 #Python
Python编程之微信推送模板消息功能示例
Aug 21 #Python
使用Python写一个贪吃蛇游戏实例代码
Aug 21 #Python
You might like
收听困难?教您超简便短波广播抗干扰方法!
2021/03/01 无线电
php格式化日期实例分析
2014/11/12 PHP
在Mac OS上自行编译安装Apache服务器和PHP解释器
2015/12/24 PHP
php用正则判断是否为数字的方法
2016/03/25 PHP
php连接MSsql server的五种方法总结
2018/03/04 PHP
解决使用attachEvent函数时,this指向被绑定的元素的问题的方法
2007/08/13 Javascript
jquery.cvtooltip.js 基于jquery的气泡提示插件
2010/11/19 Javascript
js监听输入框值的即时变化onpropertychange、oninput
2011/07/13 Javascript
jquery利用命名空间移除绑定事件的方法
2015/03/11 Javascript
JavaScript调用传递变量参数的相关问题及解决办法
2015/11/01 Javascript
JS实现发送短信验证后按钮倒计时功能(防止刷新倒计时失效)
2017/07/07 Javascript
快速解决select2在bootstrap模态框中下拉框隐藏的问题
2018/08/10 Javascript
vue 自定义提示框(Toast)组件的实现代码
2018/08/17 Javascript
Vue事件修饰符native、self示例详解
2019/07/09 Javascript
JS FormData对象使用方法实例详解
2020/02/12 Javascript
原生javascript实现类似vue的数据绑定功能示例【观察者模式】
2020/02/24 Javascript
Python中输出ASCII大文字、艺术字、字符字小技巧
2015/04/28 Python
Python使用Tkinter实现机器人走迷宫
2018/01/22 Python
Python基于递归实现电话号码映射功能示例
2018/04/13 Python
python操作excel的方法(xlsxwriter包的使用)
2018/06/11 Python
Python Django切换MySQL数据库实例详解
2019/07/16 Python
用Python徒手撸一个股票回测框架搭建【推荐】
2019/08/05 Python
Python爬虫实现使用beautifulSoup4爬取名言网功能案例
2019/09/15 Python
python 多进程并行编程 ProcessPoolExecutor的实现
2019/10/11 Python
Python自动重新加载模块详解(autoreload module)
2020/04/01 Python
Selenium结合BeautifulSoup4编写简单的python爬虫
2020/11/06 Python
Python爬虫过程解析之多线程获取小米应用商店数据
2020/11/14 Python
利用css3制作3D样式按钮实现代码
2013/03/18 HTML / CSS
公司企业表扬信
2014/01/11 职场文书
客户服务经理岗位职责
2014/01/29 职场文书
班级心理活动总结
2014/07/04 职场文书
小学生三分钟演讲稿
2014/08/18 职场文书
小学德育工作总结2015
2015/05/12 职场文书
2016年大学生暑期社会实践方案
2015/11/26 职场文书
创业计划书之干洗店
2019/09/10 职场文书
Redis集群节点通信过程/原理流程分析
2022/03/18 Redis