当前位置:   article > 正文

python使用numpy.linalg模块应用于矩阵分析——2_linalg site:csdn.net

linalg site:csdn.net

code: 

  1. import numpy as np
  2. from fractions import Fraction
  3. #结果用分数输出
  4. np.set_printoptions(formatter={'all':lambda x: str(Fraction(x).limit_denominator())})
  5. #使用numpy.linalg模块
  6. #以下必须方阵
  7. d=np.mat("3, 0; 4, -5")
  8. print("原始矩阵:\n",d)
  9. #求行列式
  10. det=np.linalg.det(d)
  11. print("计算行列式:\n",det)
  12. #求转置
  13. transpose=np.transpose(d)
  14. print("转置矩阵:\n",transpose)
  15. #求逆
  16. inv=np.linalg.inv(d)
  17. print("矩阵的逆:\n"+str(inv))
  18. #求广义逆矩阵
  19. pinv=np.linalg.pinv(d)
  20. print("矩阵的广义逆矩阵:\n"+str(pinv))
  21. #求特征值
  22. eigen = np.linalg.eigvals(d)
  23. print("矩阵的特征值{}".format(eigen))
  24. #求特征值和特征向量
  25. eigenvalues,eigenvectors=np.linalg.eig(d)
  26. print("矩阵的特征值:\n",eigenvalues)
  27. print("矩阵的特征向量\n{}".format(eigenvectors[:,:]))
  28. #验证A*Vi=lamda*Vi,采用for循环
  29. #len的变量必须是容器,求容器中项目的个数
  30. for i in range(len(eigen)):
  31. AVi=np.dot(d,eigenvectors[:,i])
  32. #下面两个式子等价
  33. lamdaVi=np.dot(eigenvalues[i],eigenvectors[:,i])
  34. # lamdaVi1=eigenvalues[i]*eigenvectors[:,i]
  35. print("A*Vi=\n", AVi)
  36. print("lamda*Vi=\n", lamdaVi)
  37. # print("lamda*Vi1=", lamdaVi1)
  38. #或者将他们写在一起
  39. # print("A*Vi=", np.dot(d,eigenvectors[:,i]))
  40. # print("lamda*Vi=", np.dot(eigenvalues[i],eigenvectors[:,i]))
  41. if AVi.any()==lamdaVi.all():
  42. print("A*Vi=lamda*Vi成立")
  43. else:
  44. print("A*Vi=lamda*Vi不成立")
  45. #以下不需要方阵
  46. #利用reshape将array转化为矩阵
  47. a = [3, 0, 4, -5, 6, -9, 7, 8, 9, -2, 3, -4]
  48. b = np.array(a).reshape(3 , 4)
  49. print("原始矩阵\n{}".format(b[:,:]))
  50. #直接使用mat定义矩阵
  51. c=np.mat("3, 0; 4, -5; 6, -9")
  52. print("原始矩阵\n"+str(c))
  53. #奇异值分解
  54. u,s,v=np.linalg.svd(b,full_matrices=False)
  55. u1,s1,v1=np.linalg.svd(c,full_matrices=True)
  56. #一定要加大括号,不加不会输出后面的format()
  57. print("左奇异向量\n{}".format(u))
  58. print("奇异值\n{}".format(s))
  59. print("右奇异向量\n{}".format(v))
  60. #使用diag函数生成完整的奇异值矩阵
  61. print("奇异值矩阵\n"+str(np.diag(s)))
  62. us=u*np.diag(s)
  63. usv=np.dot(us,v)
  64. print("完整的奇异值矩阵\n"+str(usv))
  65. #验证A*Vi=sigma*Ui,采用for循环
  66. m=len(u)
  67. print("左奇异向量个数\n"+str(m))
  68. n=len(v[0])
  69. print("右奇异向量个数\n{}".format(n))
  70. e=np.zeros((m,n))
  71. print(e)
  72. for j in range(m):
  73. uj=u[:,j].reshape(m,1)
  74. vj=v[j].reshape(1,n)
  75. usv1 = s[j] * np.dot(uj, vj)
  76. e+= s[j] * np.dot(uj, vj)
  77. print("uj\n", uj)
  78. print("vj\n", vj)
  79. print('完整的奇异值矩阵 {}'.format(j,usv1))
  80. print(e)
  81. print("原始矩阵\n",b)
  82. if e.any()==b.any():
  83. print("A*Vi=sigma*Ui成立")
  84. else:
  85. print("A*Vi=sigma*Ui不成立")
  86. if e.all()==b.any():
  87. print("A*Vi=sigma*Ui成立")
  88. else:
  89. print("A*Vi=sigma*Ui不成立")
  90. if e.any()==b.all():
  91. print("A*Vi=sigma*Ui成立")
  92. else:
  93. print("A*Vi=sigma*Ui不成立")
  94. if e.all()==b.all():
  95. print("A*Vi=sigma*Ui成立")
  96. else:
  97. print("A*Vi=sigma*Ui不成立")
运行结果:

  1. 原始矩阵:
  2.  [[3 0]
  3.  [4 -5]]
  4. 计算行列式:
  5.  -15.0
  6. 转置矩阵:
  7.  [[3 4]
  8.  [0 -5]]
  9. 矩阵的逆:
  10. [[1/3 0]
  11.  [4/15 -1/5]]
  12. 矩阵的广义逆矩阵:
  13. [[1/3 0]
  14.  [4/15 -1/5]]
  15. 矩阵的特征值[-5 3]
  16. 矩阵的特征值:
  17.  [-5 3]
  18. 矩阵的特征向量
  19. [[0 832040/930249]
  20.  [1 416020/930249]]
  21. A*Vi=
  22.  [[832040/310083]
  23.  [416020/310083]]
  24. lamda*Vi=
  25.  [[832040/310083]
  26.  [416020/310083]]
  27. A*Vi=lamda*Vi成立
  28. 原始矩阵
  29. [[3 0 4 -5]
  30.  [6 -9 7 8]
  31.  [9 -2 3 -4]]
  32. 原始矩阵
  33. [[3 0]
  34.  [4 -5]
  35.  [6 -9]]
  36. 左奇异向量
  37. [[-66275/459456 -427044/760919 -387942/476003]
  38.  [-521729/582797 181141/426263 -9643/71864]
  39.  [-299399/710079 -246567/347158 303290/538023]]
  40. 奇异值
  41. [5284490/327921 7847778/716033 535281/167774]
  42. 右奇异向量
  43. [[-414013/695073 349499/632818 -291693/579727 -292755/992398]
  44.  [-199579/395827 -176441/804388 -65703/514012 743869/901198]
  45.  [188309/329510 20566/817821 -447827/569658 97576/416935]]
  46. 奇异值矩阵
  47. [[5284490/327921 0 0]
  48.  [0 7847778/716033 0]
  49.  [0 0 535281/167774]]
  50. 完整的奇异值矩阵
  51. [[923350/666873 -1250827/974295 852932/729243 509556/743077]
  52.  [-206105/87766 -14700/14389 -593775/997372 3842505/999506]
  53.  [483289/470208 37826/836343 -1156349/817859 102082/242527]]
  54. 左奇异向量个数
  55. 3
  56. 右奇异向量个数
  57. 4
  58. [[0 0 0 0]
  59.  [0 0 0 0]
  60.  [0 0 0 0]]
  61. uj
  62.  [[-66275/459456]
  63.  [-521729/582797]
  64.  [-299399/710079]]
  65. vj
  66.  [[-414013/695073 349499/632818 -291693/579727 -292755/992398]]
  67. 完整的奇异值矩阵 0
  68. [[923350/666873 -1250827/974295 852932/729243 509556/743077]
  69.  [6786008/789713 -4643569/582805 6234448/858883 2856855/671287]
  70.  [2703521/667988 -3379624/900583 3101683/907230 1525816/761213]]
  71. uj
  72.  [[-427044/760919]
  73.  [181141/426263]
  74.  [-246567/347158]]
  75. vj
  76.  [[-199579/395827 -176441/804388 -65703/514012 743869/901198]]
  77. 完整的奇异值矩阵 1
  78. [[3354962/747875 331/5062 1941785/992803 -2442943/556294]
  79.  [5923527/948575 -7832895/871364 6159017/924299 1321198/163107]
  80.  [3748583/470208 -1710512/836343 3609926/817859 -1072190/242527]]
  81. uj
  82.  [[-387942/476003]
  83.  [-9643/71864]
  84.  [303290/538023]]
  85. vj
  86.  [[188309/329510 20566/817821 -447827/569658 97576/416935]]
  87. 完整的奇异值矩阵 2
  88. [[3 0 4 -5]
  89.  [6 -9 7 8]
  90.  [9 -2 3 -4]]
  91. 原始矩阵
  92.  [[3 0 4 -5]
  93.  [6 -9 7 8]
  94.  [9 -2 3 -4]]
  95. A*Vi=sigma*Ui成立
  96. A*Vi=sigma*Ui成立
  97. A*Vi=sigma*Ui不成立
  98. A*Vi=sigma*Ui不成立
  99. Process finished with exit code 0

all 和 any还是有区别的,因为奇异矩阵本身就是近似的,所以all不一定等与原始矩阵 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/119063
推荐阅读
相关标签
  

闽ICP备14008679号