Python實(shí)現(xiàn)的矩陣類實(shí)例
本文實(shí)例講述了Python實(shí)現(xiàn)的矩陣類。分享給大家供大家參考,具體如下:
科學(xué)計算離不開矩陣的運(yùn)算。當(dāng)然,python已經(jīng)有非常好的現(xiàn)成的庫:numpy(numpy的簡單安裝與使用可參考http://www.dbjr.com.cn/article/66236.htm)。
我寫這個矩陣類,并不是打算重新造一個輪子,只是作為一個練習(xí),記錄在此。
注:這個類的函數(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, "不是方陣,無法計算代數(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): '''計算行列式(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())
更多關(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è)計有所幫助。
相關(guān)文章
基于python實(shí)現(xiàn)百度語音識別和圖靈對話
這篇文章主要介紹了基于python實(shí)現(xiàn)百度語音識別和圖靈對話,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-11-11Python和Java的語法對比分析語法簡潔上python的確完美勝出
Python是一種廣泛使用的解釋型、高級編程、通用型編程語言,由吉多·范羅蘇姆創(chuàng)造,第一版發(fā)布于1991年。這篇文章主要介紹了Python和Java的語法對比,語法簡潔上python的確完美勝出 ,需要的朋友可以參考下2019-05-05利用python設(shè)計圖像加密技術(shù)(Arnold算法)
這篇文章主要介紹了利用python設(shè)計圖像加密技術(shù)(Arnold算法),本文將借助Arnold置亂法,講解如何用python從頭至尾設(shè)計出一套圖像加密算法,需要的小伙伴可以才參考一下2022-03-03Sentry的安裝、配置、使用教程(Sentry日志手機(jī)系統(tǒng))
Sentry?是一個實(shí)時事件日志記錄和聚合平臺,由于ExceptionLess官方提供的客戶端只有.Net/.NetCore平臺和js的,本文繼續(xù)介紹另一個日志收集系統(tǒng)Sentry,感興趣的朋友一起看看吧2022-07-07Python可視化Matplotlib散點(diǎn)圖scatter()用法詳解
這篇文章主要介紹了Python可視化中Matplotlib散點(diǎn)圖scatter()的用法詳解,文中附含詳細(xì)示例代碼,有需要得朋友可以借鑒參考下,希望能夠有所幫助2021-09-09Python讀取postgresql數(shù)據(jù)庫詳情
這篇文章主要介紹了Python讀取postgresql數(shù)據(jù)庫詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09