Python实现的矩阵类实例

发布时间 - 2026-01-11 02:54:31    点击率:

本文实例讲述了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 实现一个反向单位矩阵示例  # 不匹配  # 新造  # 进阶  # 还没  # 相关内容  # 在此  # 数据结构  # 给大家  # 作为一个  # 非常好  # 更多关于  # 我写  # 所述  # 程序设计  # 值为  # 使用技巧  # 两行  # 若为  # 操作技巧  # 相减 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  高性能网站服务器部署指南:稳定运行与安全配置优化方案  在centOS 7安装mysql 5.7的详细教程  潮流网站制作头像软件下载,适合母子的网名有哪些?  清除minerd进程的简单方法  公司门户网站制作流程,华为官网怎么做?  谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  如何用AWS免费套餐快速搭建高效网站?  文字头像制作网站推荐软件,醒图能自动配文字吗?  bing浏览器学术搜索入口_bing学术文献检索地址  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  浅述节点的创建及常见功能的实现  Laravel如何使用withoutEvents方法临时禁用模型事件  Linux系统运维自动化项目教程_Ansible批量管理实战  php json中文编码为null的解决办法  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  原生JS实现图片轮播切换效果  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  如何快速使用云服务器搭建个人网站?  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制  JS弹性运动实现方法分析  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  如何在阿里云ECS服务器部署织梦CMS网站?  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  如何快速搭建个人网站并优化SEO?  linux top下的 minerd 木马清除方法  如何获取PHP WAP自助建站系统源码?  如何为不同团队 ID 动态生成多个非值班状态按钮  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  如何在腾讯云服务器上快速搭建个人网站?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  电商网站制作价格怎么算,网上拍卖流程以及规则?  JavaScript中的标签模板是什么_它如何扩展字符串功能  LinuxCD持续部署教程_自动发布与回滚机制  zabbix利用python脚本发送报警邮件的方法  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  高防服务器租用首荐平台,企业级优惠套餐快速部署  JavaScript常见的五种数组去重的方式  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  Python函数文档自动校验_规范解析【教程】  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】  长沙做网站要多少钱,长沙国安网络怎么样?  Laravel如何记录自定义日志?(Log频道配置)