1. import numpy as np
    2. A = np.linspace(0,14,15).reshape((3,-1)) # 生成0-14 3行5列
    3. print(A)
    4. def SVD(A,n):
    5. M = np.dot(A,A.T)
    6. eigval,eigvec = np.linalg.eig(M)
    7. indexs = np.argsort(-eigval)[:n]
    8. U = eigvec[:,indexs]
    9. sigma_sq = eigval[indexs]
    10. M = np.dot(A.T,A)
    11. eigval ,eigvec = np.linalg.eig(M)
    12. indexs = np.argsort(-eigval)[:n]
    13. V = eigvec[:,indexs]
    14. sigma = np.diag(np.sqrt(sigma_sq))
    15. return np.dot(np.dot(U,sigma),V.T)
    16. A_ = SVD(A,2)
    17. print(A_)
    18. print(np.linalg.norm(A_-A))

    https://www.cnblogs.com/pinard/p/6251584.html

    np.linalg.eig(M) 计算方阵的特征值和右特征向量。
    https://numpy.org/doc/stable/reference/generated/numpy.linalg.eig.html