赞
踩
code:
- import numpy as np
- from fractions import Fraction
- #结果用分数输出
- np.set_printoptions(formatter={'all':lambda x: str(Fraction(x).limit_denominator())})
- #使用numpy.linalg模块
- #以下必须方阵
- d=np.mat("3, 0; 4, -5")
- print("原始矩阵:\n",d)
- #求行列式
- det=np.linalg.det(d)
- print("计算行列式:\n",det)
- #求转置
- transpose=np.transpose(d)
- print("转置矩阵:\n",transpose)
- #求逆
- inv=np.linalg.inv(d)
- print("矩阵的逆:\n"+str(inv))
- #求广义逆矩阵
- pinv=np.linalg.pinv(d)
- print("矩阵的广义逆矩阵:\n"+str(pinv))
- #求特征值
- eigen = np.linalg.eigvals(d)
- print("矩阵的特征值{}".format(eigen))
- #求特征值和特征向量
- eigenvalues,eigenvectors=np.linalg.eig(d)
- print("矩阵的特征值:\n",eigenvalues)
- print("矩阵的特征向量\n{}".format(eigenvectors[:,:]))
- #验证A*Vi=lamda*Vi,采用for循环
- #len的变量必须是容器,求容器中项目的个数
- for i in range(len(eigen)):
- AVi=np.dot(d,eigenvectors[:,i])
- #下面两个式子等价
- lamdaVi=np.dot(eigenvalues[i],eigenvectors[:,i])
- # lamdaVi1=eigenvalues[i]*eigenvectors[:,i]
- print("A*Vi=\n", AVi)
- print("lamda*Vi=\n", lamdaVi)
- # print("lamda*Vi1=", lamdaVi1)
- #或者将他们写在一起
- # print("A*Vi=", np.dot(d,eigenvectors[:,i]))
- # print("lamda*Vi=", np.dot(eigenvalues[i],eigenvectors[:,i]))
- if AVi.any()==lamdaVi.all():
- print("A*Vi=lamda*Vi成立")
- else:
- print("A*Vi=lamda*Vi不成立")
- #以下不需要方阵
- #利用reshape将array转化为矩阵
- a = [3, 0, 4, -5, 6, -9, 7, 8, 9, -2, 3, -4]
- b = np.array(a).reshape(3 , 4)
- print("原始矩阵\n{}".format(b[:,:]))
- #直接使用mat定义矩阵
- c=np.mat("3, 0; 4, -5; 6, -9")
- print("原始矩阵\n"+str(c))
- #奇异值分解
- u,s,v=np.linalg.svd(b,full_matrices=False)
- u1,s1,v1=np.linalg.svd(c,full_matrices=True)
- #一定要加大括号,不加不会输出后面的format()
- print("左奇异向量\n{}".format(u))
- print("奇异值\n{}".format(s))
- print("右奇异向量\n{}".format(v))
- #使用diag函数生成完整的奇异值矩阵
- print("奇异值矩阵\n"+str(np.diag(s)))
- us=u*np.diag(s)
- usv=np.dot(us,v)
- print("完整的奇异值矩阵\n"+str(usv))
- #验证A*Vi=sigma*Ui,采用for循环
- m=len(u)
- print("左奇异向量个数\n"+str(m))
- n=len(v[0])
- print("右奇异向量个数\n{}".format(n))
- e=np.zeros((m,n))
- print(e)
- for j in range(m):
- uj=u[:,j].reshape(m,1)
- vj=v[j].reshape(1,n)
- usv1 = s[j] * np.dot(uj, vj)
- e+= s[j] * np.dot(uj, vj)
- print("uj\n", uj)
- print("vj\n", vj)
- print('完整的奇异值矩阵 {}'.format(j,usv1))
- print(e)
- print("原始矩阵\n",b)
- if e.any()==b.any():
- print("A*Vi=sigma*Ui成立")
- else:
- print("A*Vi=sigma*Ui不成立")
- if e.all()==b.any():
- print("A*Vi=sigma*Ui成立")
- else:
- print("A*Vi=sigma*Ui不成立")
- if e.any()==b.all():
- print("A*Vi=sigma*Ui成立")
- else:
- print("A*Vi=sigma*Ui不成立")
- if e.all()==b.all():
- print("A*Vi=sigma*Ui成立")
- else:
- print("A*Vi=sigma*Ui不成立")
运行结果:
- 原始矩阵:
- [[3 0]
- [4 -5]]
- 计算行列式:
- -15.0
- 转置矩阵:
- [[3 4]
- [0 -5]]
- 矩阵的逆:
- [[1/3 0]
- [4/15 -1/5]]
- 矩阵的广义逆矩阵:
- [[1/3 0]
- [4/15 -1/5]]
- 矩阵的特征值[-5 3]
- 矩阵的特征值:
- [-5 3]
- 矩阵的特征向量
- [[0 832040/930249]
- [1 416020/930249]]
- A*Vi=
- [[832040/310083]
- [416020/310083]]
- lamda*Vi=
- [[832040/310083]
- [416020/310083]]
- A*Vi=lamda*Vi成立
- 原始矩阵
- [[3 0 4 -5]
- [6 -9 7 8]
- [9 -2 3 -4]]
- 原始矩阵
- [[3 0]
- [4 -5]
- [6 -9]]
- 左奇异向量
- [[-66275/459456 -427044/760919 -387942/476003]
- [-521729/582797 181141/426263 -9643/71864]
- [-299399/710079 -246567/347158 303290/538023]]
- 奇异值
- [5284490/327921 7847778/716033 535281/167774]
- 右奇异向量
- [[-414013/695073 349499/632818 -291693/579727 -292755/992398]
- [-199579/395827 -176441/804388 -65703/514012 743869/901198]
- [188309/329510 20566/817821 -447827/569658 97576/416935]]
- 奇异值矩阵
- [[5284490/327921 0 0]
- [0 7847778/716033 0]
- [0 0 535281/167774]]
- 完整的奇异值矩阵
- [[923350/666873 -1250827/974295 852932/729243 509556/743077]
- [-206105/87766 -14700/14389 -593775/997372 3842505/999506]
- [483289/470208 37826/836343 -1156349/817859 102082/242527]]
- 左奇异向量个数
- 3
- 右奇异向量个数
- 4
- [[0 0 0 0]
- [0 0 0 0]
- [0 0 0 0]]
- uj
- [[-66275/459456]
- [-521729/582797]
- [-299399/710079]]
- vj
- [[-414013/695073 349499/632818 -291693/579727 -292755/992398]]
- 完整的奇异值矩阵 0
- [[923350/666873 -1250827/974295 852932/729243 509556/743077]
- [6786008/789713 -4643569/582805 6234448/858883 2856855/671287]
- [2703521/667988 -3379624/900583 3101683/907230 1525816/761213]]
- uj
- [[-427044/760919]
- [181141/426263]
- [-246567/347158]]
- vj
- [[-199579/395827 -176441/804388 -65703/514012 743869/901198]]
- 完整的奇异值矩阵 1
- [[3354962/747875 331/5062 1941785/992803 -2442943/556294]
- [5923527/948575 -7832895/871364 6159017/924299 1321198/163107]
- [3748583/470208 -1710512/836343 3609926/817859 -1072190/242527]]
- uj
- [[-387942/476003]
- [-9643/71864]
- [303290/538023]]
- vj
- [[188309/329510 20566/817821 -447827/569658 97576/416935]]
- 完整的奇异值矩阵 2
- [[3 0 4 -5]
- [6 -9 7 8]
- [9 -2 3 -4]]
- 原始矩阵
- [[3 0 4 -5]
- [6 -9 7 8]
- [9 -2 3 -4]]
- A*Vi=sigma*Ui成立
- A*Vi=sigma*Ui成立
- A*Vi=sigma*Ui不成立
- A*Vi=sigma*Ui不成立
- Process finished with exit code 0
all 和 any还是有区别的,因为奇异矩阵本身就是近似的,所以all不一定等与原始矩阵
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。