国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

Python實(shí)現(xiàn)的矩陣類實(shí)例

2020-01-04 16:48:16
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文實(shí)例講述了Python實(shí)現(xiàn)的矩陣類。分享給大家供大家參考,具體如下:

科學(xué)計(jì)算離不開矩陣的運(yùn)算。當(dāng)然,python已經(jīng)有非常好的現(xiàn)成的庫(kù):numpy(numpy的簡(jiǎn)單安裝與使用可參考)

我寫這個(gè)矩陣類,并不是打算重新造一個(gè)輪子,只是作為一個(gè)練習(xí),記錄在此。

注:這個(gè)類的函數(shù)還沒全部實(shí)現(xiàn),慢慢在完善吧。

全部代碼:

import copyclass 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]  # 設(shè)置元素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,則向下交換最近的當(dāng)前列元素非零的行      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):    '''行簡(jiǎn)化階梯矩陣'''    pass  def transpose(self):    '''轉(zhuǎn)置'''    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):    '''代數(shù)余子式(用于行列式展開)'''    assert self.row == self.column, "不是方陣,無(wú)法計(jì)算代數(shù)余子式"    assert self.row >= 3, "至少是3*3階方陣"    assert row <= self.row and column <= self.column, "下標(biāo)超出范圍"    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):    '''計(jì)算行列式(determinant)'''    assert self.row == self.column,"非行列式,不能計(jì)算"    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矩陣,無(wú)單位矩陣"    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())

希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 临清市| 三原县| 永年县| 五峰| 宜兴市| 岚皋县| 隆尧县| 始兴县| 泾源县| 团风县| 台东市| 察隅县| 泾源县| 石狮市| 紫云| 临安市| 昆山市| 临海市| 右玉县| 景泰县| 长武县| 邢台市| 磐安县| 临江市| 无极县| 房产| 贵溪市| 普安县| 昌平区| 荆州市| 二连浩特市| 沐川县| 顺平县| 中山市| 密山市| 柳河县| 吴堡县| 桃江县| 清河县| 怀来县| 万盛区|