一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Python实现的矩阵类实例

时间:2017-08-22 编辑:猪哥 来源:一聚教程网

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

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

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

全部代码:

importcopy
classMatrix:
  '''矩阵类'''
  def__init__(self, row, column, fill=0.0):
    self.shape=(row, column)
    self.row=row
    self.column=column
    self._matrix=[[fill]*columnforiinrange(row)]
  # 返回元素m(i, j)的值: m[i, j]
  def__getitem__(self, index):
    ifisinstance(index,int):
      returnself._matrix[index-1]
    elifisinstance(index,tuple):
      returnself._matrix[index[0]-1][index[1]-1]
  # 设置元素m(i,j)的值为s: m[i, j] = s
  def__setitem__(self, index, value):
    ifisinstance(index,int):
      self._matrix[index-1]=copy.deepcopy(value)
    elifisinstance(index,tuple):
      self._matrix[index[0]-1][index[1]-1]=value
  def__eq__(self, N):
    '''相等'''
    # A == B
    assertisinstance(N, Matrix),"类型不匹配,不能比较"
    returnN.shape==self.shape# 比较维度,可以修改为别的
  def__add__(self, N):
    '''加法'''
    # A + B
    assertN.shape==self.shape,"维度不匹配,不能相加"
    M=Matrix(self.row,self.column)
    forrinrange(self.row):
      forcinrange(self.column):
        M[r, c]=self[r, c]+N[r, c]
    returnM
  def__sub__(self, N):
    '''减法'''
    # A - B
    assertN.shape==self.shape,"维度不匹配,不能相减"
    M=Matrix(self.row,self.column)
    forrinrange(self.row):
      forcinrange(self.column):
        M[r, c]=self[r, c]-N[r, c]
    returnM
  def__mul__(self, N):
    '''乘法'''
    # A * B (或:A * 2.0)
    ifisinstance(N,int)orisinstance(N,float):
      M=Matrix(self.row,self.column)
      forrinrange(self.row):
        forcinrange(self.column):
          M[r, c]=self[r, c]*N
    else:
      assertN.row==self.column,"维度不匹配,不能相乘"
      M=Matrix(self.row, N.column)
      forrinrange(self.row):
        forcinrange(N.column):
          sum=0
          forkinrange(self.column):
            sum+=self[r, k]*N[k, r]
          M[r, c]=sum
    returnM
  def__div__(self, N):
    '''除法'''
    # A / B
    pass
  def__pow__(self, k):
    '''乘方'''
    # A**k
    assertself.row==self.column,"不是方阵,不能乘方"
    M=copy.deepcopy(self)
    foriinrange(k):
      M=M*self
    returnM
  defrank(self):
    '''矩阵的秩'''
    pass
  deftrace(self):
    '''矩阵的迹'''
    pass
  defadjoint(self):
    '''伴随矩阵'''
    pass
  definvert(self):
    '''逆矩阵'''
    assertself.row==self.column,"不是方阵"
    M=Matrix(self.row,self.column*2)
    I=self.identity()# 单位矩阵
    I.show()#############################
    # 拼接
    forrinrange(1,M.row+1):
      temp=self[r]
      temp.extend(I[r])
      M[r]=copy.deepcopy(temp)
    M.show()#############################
    # 初等行变换
    forrinrange(1, M.row+1):
      # 本行首元素(M[r, r])若为 0,则向下交换最近的当前列元素非零的行
      ifM[r, r]==0:
        forrrinrange(r+1, M.row+1):
          ifM[rr, r] !=0:
            M[r],M[rr]=M[rr],M[r]# 交换两行
          break
      assertM[r, r] !=0,'矩阵不可逆'
      # 本行首元素(M[r, r])化为 1
      temp=M[r,r]# 缓存
      forcinrange(r, M.column+1):
        M[r, c]/=temp
        print("M[{0}, {1}] /= {2}".format(r,c,temp))
      M.show()
      # 本列上、下方的所有元素化为 0
      forrrinrange(1, M.row+1):
        temp=M[rr, r]# 缓存
        forcinrange(r, M.column+1):
          ifrr==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)
    forrinrange(1,self.row+1):
      N[r]=M[r][self.row:]
    returnN
  defjieti(self):
    '''行简化阶梯矩阵'''
    pass
  deftranspose(self):
    '''转置'''
    M=Matrix(self.column,self.row)
    forrinrange(self.column):
      forcinrange(self.row):
        M[r, c]=self[c, r]
    returnM
  defcofactor(self, row, column):
    '''代数余子式(用于行列式展开)'''
    assertself.row==self.column,"不是方阵,无法计算代数余子式"
    assertself.row >=3,"至少是3*3阶方阵"
    assertrow <=self.rowandcolumn <=self.column,"下标超出范围"
    M=Matrix(self.column-1,self.row-1)
    forrinrange(self.row):
      ifr==row:
        continue
      forcinrange(self.column):
        ifc==column:
          continue
        rr=r-1ifr > rowelser
        cc=c-1ifc > columnelsec
        M[rr, cc]=self[r, c]
    returnM
  defdet(self):
    '''计算行列式(determinant)'''
    assertself.row==self.column,"非行列式,不能计算"
    ifself.shape==(2,2):
      returnself[1,1]*self[2,2]-self[1,2]*self[2,1]
    else:
      sum=0.0
      forcinrange(self.column+1):
        sum+=(-1)**(c+1)*self[1,c]*self.cofactor(1,c).det()
      returnsum
  defzeros(self):
    '''全零矩阵'''
    M=Matrix(self.column,self.row, fill=0.0)
    returnM
  defones(self):
    '''全1矩阵'''
    M=Matrix(self.column,self.row, fill=1.0)
    returnM
  defidentity(self):
    '''单位矩阵'''
    assertself.row==self.column,"非n*n矩阵,无单位矩阵"
    M=Matrix(self.column,self.row)
    forrinrange(self.row):
      forcinrange(self.column):
        M[r, c]=1.0ifr==celse0.0
    returnM
  defshow(self):
    '''打印矩阵'''
    forrinrange(self.row):
      forcinrange(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())


热门栏目