Python实现的矩阵类实例

作者:罗兵 时间:2023-08-13 07:52:09 

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

科学计算离不开矩阵的运算。当然,python已经有非常好的现成的库:numpy(numpy的简单安装与使用可参考https://www.jb51.net/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程序设计有所帮助。

来源:http://www.cnblogs.com/hhh5460/p/4314231.html

标签:Python,矩阵
0
投稿

猜你喜欢

  • python 判断三个数字中的最大值实例代码

    2021-03-23 00:01:04
  • 详解python pandas 分组统计的方法

    2021-01-30 05:33:48
  • Python中itertools的用法详解

    2022-06-05 13:34:52
  • 如何Restore数据库备份文件?

    2009-11-02 20:20:00
  • golang如何通过viper读取config.yaml文件

    2023-07-22 05:46:11
  • python使用tcp传输图片数据

    2023-08-09 06:33:48
  • 使用Python的package机制如何简化utils包设计详解

    2021-08-14 04:21:06
  • Python的Django框架中消息通知的计数器实现教程

    2021-03-22 04:13:43
  • 一些关于python 装饰器的个人理解

    2021-11-27 21:41:33
  • python中yield函数的用法详解

    2022-03-14 13:57:13
  • 如何使用Python实现自动化水军评论

    2022-08-25 21:15:48
  • Django的restframework接口框架自定义返回数据格式的示例详解

    2023-06-13 05:13:51
  • SQL“多字段模糊匹配关键字查询”

    2008-04-24 14:16:00
  • 三达不溜:www

    2009-03-28 11:44:00
  • Keras 切换后端方式(Theano和TensorFlow)

    2023-05-30 22:35:03
  • JavaScript实现简单贪吃蛇效果

    2023-08-13 05:48:08
  • 详细讲解Access数据库远程连接的实用方法

    2008-11-28 16:34:00
  • Yahoo!网站性能最佳体验的34条黄金守则——图片、Coockie与移动应用

    2008-05-29 13:44:00
  • 关于python中time和datetime的区别与用法

    2022-07-15 00:54:17
  • python连接mongodb集群方法详解

    2021-08-26 11:45:08
  • asp之家 网络编程 m.aspxhome.com