最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Python实现的矩阵类实例
时间:2017-08-22 编辑:猪哥 来源:一聚教程网
科学计算离不开矩阵的运算。当然,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())
相关文章
- Golang ProtoBuf的基本语法详解 10-20
- Python识别MySQL中的冗余索引解析 10-20
- Python+Pygame绘制小球代码展示 10-18
- Python中的数据精度问题介绍 10-18
- Python随机值生成的常用方法介绍 10-18
- python3解压缩.gz文件分析 09-27