Python實(shí)現(xiàn)的矩陣類實(shí)例
本文實(shí)例講述了Python實(shí)現(xiàn)的矩陣類。分享給大家供大家參考,具體如下:
科學(xué)計算離不開矩陣的運(yùn)算。當(dāng)然,python已經(jīng)有非常好的現(xiàn)成的庫:numpy(numpy的簡單安裝與使用可參考http://www.dhdzp.com/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)文章
向量化操作改進(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)移動詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
Python實(shí)現(xiàn)矩陣運(yùn)算的方法代碼實(shí)例
這篇文章主要介紹了Python實(shí)現(xiàn)矩陣運(yùn)算的方法代碼實(shí)例,想用python實(shí)現(xiàn)一個矩陣類,它可以像matlab或者numpy中的矩陣一樣進(jìn)行運(yùn)算,生成一個矩陣類Matrix之后,他接收一個二維列表作為輸入,然后將對應(yīng)的值寫到矩陣對應(yīng)的位置,需要的朋友可以參考下2023-08-08
Windows系統(tǒng)下PhantomJS的安裝和基本用法
今天小編就為大家分享一篇關(guān)于Windows系統(tǒng)下PhantomJS的安裝和基本用法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-10-10
Python 按比例獲取樣本數(shù)據(jù)或執(zhí)行任務(wù)的實(shí)現(xiàn)代碼
這篇文章主要介紹了Python 按比例獲取樣本數(shù)據(jù)或執(zhí)行任務(wù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12

