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不一定等与原始矩阵