最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2017年08月22日 11:27:03   作者:羅兵  
這篇文章主要介紹了Python實(shí)現(xiàn)的矩陣類,結(jié)合完整實(shí)例形式分析了Python矩陣的定義、計(jì)算、轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下

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

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

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

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

全部代碼:

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]
  # 設(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):
    '''行簡化階梯矩陣'''
    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, "不是方陣,無法計(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矩陣,無單位矩陣"
    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())

更多關(guān)于Python相關(guān)內(nèi)容可查看本站專題:《Python數(shù)學(xué)運(yùn)算技巧總結(jié)》、《Python正則表達(dá)式用法總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進(jìn)階經(jīng)典教程

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

相關(guān)文章

  • 如何在C++中調(diào)用Python

    如何在C++中調(diào)用Python

    雖然現(xiàn)在Python編程語言十分的火爆,但是實(shí)際上非要用一門語言去完成所有的任務(wù),并不是說不可以,而是不合適。在一些特定的、對于性能要求比較高的場景,還是需要用到傳統(tǒng)的C++來進(jìn)行編程的。本文將用C++的代碼去調(diào)用Python函數(shù)中實(shí)現(xiàn)的一些功能
    2021-05-05
  • 向量化操作改進(jìn)數(shù)據(jù)分析工作流的Pandas?Numpy示例分析

    向量化操作改進(jìn)數(shù)據(jù)分析工作流的Pandas?Numpy示例分析

    這篇文章主要介紹了向量化操作改進(jìn)數(shù)據(jù)分析工作流的Pandas?Numpy示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Python基礎(chǔ)之文件操作及光標(biāo)移動詳解

    Python基礎(chǔ)之文件操作及光標(biāo)移動詳解

    這篇文章主要為大家介紹了Python基礎(chǔ)之文件操作及光標(biāo)移動詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 使用Python創(chuàng)建自助搶單插件的完整步驟

    使用Python創(chuàng)建自助搶單插件的完整步驟

    文章介紹了如何使用Python編寫一個(gè)自助搶單插件,該插件可以幫助用戶監(jiān)控特定網(wǎng)站上的商品信息,并在條件滿足時(shí)自動下單,文章涵蓋了從項(xiàng)目概述、技術(shù)架構(gòu)、項(xiàng)目流程到環(huán)境準(zhǔn)備、網(wǎng)絡(luò)請求、數(shù)據(jù)解析、用戶界面設(shè)計(jì)和定時(shí)任務(wù)的詳細(xì)步驟
    2024-11-11
  • python中adb有什么功能

    python中adb有什么功能

    在本篇文章里小編給大家分享的是關(guān)于python中adb有功能的知識點(diǎn)總結(jié),有需要的可以跟著學(xué)習(xí)下。
    2020-06-06
  • Python實(shí)現(xiàn)矩陣運(yùn)算的方法代碼實(shí)例

    Python實(shí)現(xiàn)矩陣運(yùn)算的方法代碼實(shí)例

    這篇文章主要介紹了Python實(shí)現(xiàn)矩陣運(yùn)算的方法代碼實(shí)例,想用python實(shí)現(xiàn)一個(gè)矩陣類,它可以像matlab或者numpy中的矩陣一樣進(jìn)行運(yùn)算,生成一個(gè)矩陣類Matrix之后,他接收一個(gè)二維列表作為輸入,然后將對應(yīng)的值寫到矩陣對應(yīng)的位置,需要的朋友可以參考下
    2023-08-08
  • python中將字典改造為對象的方法

    python中將字典改造為對象的方法

    這篇文章主要介紹了python中將字典改造為對象的方法,在實(shí)際項(xiàng)目中,當(dāng)使用json模塊加載一個(gè)深度很深的字典類型的json文件時(shí),使用字典的訪問方式,將會出現(xiàn)很多中括號,即不直觀也不美觀,可以將這個(gè)字典轉(zhuǎn)化為對象,使得可以用.的方式訪問,需要的朋友可以參考下
    2023-11-11
  • python如何實(shí)現(xiàn)DES加密

    python如何實(shí)現(xiàn)DES加密

    這篇文章主要介紹了python如何實(shí)現(xiàn)DES加密,幫助大家更好的理解和學(xué)習(xí)密碼學(xué),感興趣的朋友可以了解下
    2020-09-09
  • Windows系統(tǒng)下PhantomJS的安裝和基本用法

    Windows系統(tǒng)下PhantomJS的安裝和基本用法

    今天小編就為大家分享一篇關(guān)于Windows系統(tǒng)下PhantomJS的安裝和基本用法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • Python 按比例獲取樣本數(shù)據(jù)或執(zhí)行任務(wù)的實(shí)現(xiàn)代碼

    Python 按比例獲取樣本數(shù)據(jù)或執(zhí)行任務(wù)的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Python 按比例獲取樣本數(shù)據(jù)或執(zhí)行任務(wù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12

最新評論

馆陶县| 开封县| 永清县| 德昌县| 石泉县| 香港| 华蓥市| 深泽县| 铁岭市| 双辽市| 信丰县| 准格尔旗| 雷州市| 蒙阴县| 民权县| 武安市| 中江县| 台安县| 亚东县| 西平县| 巩留县| 南安市| 扎囊县| 伊宁市| 烟台市| 柳河县| 武邑县| 浦东新区| 曲松县| 乌鲁木齐市| 天等县| 旬邑县| 新昌县| 合肥市| 安西县| 湖北省| 刚察县| 余庆县| 通江县| 沙湾县| 垫江县|