Python实现的矩阵类实例
本文实例讲述了Python实现的矩阵类。分享给大家供大家参考,具体如下:
科学计算离不开矩阵的运算。当然,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())
更多关于Python相关内容可查看本站专题:《Python数学运算技巧总结》、《Python正则表达式用法总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》
希望本文所述对大家Python程序设计有所帮助。