Python v/s MATLAB 中的 SVD 命令

SVD command in Python v/s MATLAB

我在 MATLAB 中有 m = 10, n = 5, A=randn(m,n);[U,S,V]=svd(A); 这个 returns 一个完整的 10x5 S 矩阵,而 Python 只有 returns S 作为一个 5x1 数组。如何在 Python 中恢复完整的 S 矩阵?我曾尝试在网上查找几篇 Whosebug 帖子,但令人惊讶的是并没有阐明这一点。

此外,Python IDE 有多重要?我使用 Spyder,但有人告诉我 Vim 可能是最常见的。

非常感谢。

要恢复完整矩阵,您可以执行以下操作:

import numpy as np
m = 10
n = 5
A=np.random.randn(m,n)
U,S,V =np.linalg.svd(A)

没错S.shape = (5,).

你想要类似于 https://www.mathworks.com/help/matlab/ref/svd.html 的东西,其中 A = 4x2 最后也是 S = 4×2

为此,您定义了一个矩阵 B = np.zeros(A.shape)。然后用 S 的元素填充它的对角线。我所说的对角线是指 i==j 如下:

B = np.zeros(A.shape)
for i in range(m) :
    for j in range(n) :
        if i == j : B[i,j] = S[j]

现在 B.shape = (10,5) 符合预期 或者更紧凑的形式:

C = np.array([[S[j] if i==j else 0 for j in range(n)] for i in range(m)])   

希望对你有帮助

第二个问题,我使用gedit(标准文本编辑器) 运行 ipython中的代码 shell.

你也可以去jupyter看看

矩阵的SVD可以写成

A = U S V^H

其中 ^H 表示 conjugate transpose。 Matlab的svd命令returnsU、S和V,而numpy.linalg.svdreturnsU,S的对角线,V^H .因此,要获得与 Matlab 中相同的 S 和 V,您需要重建 S 并获得 V:

import numpy

m = 10
n = 5
A = numpy.random.randn(m, n)
U, sdiag, VH = numpy.linalg.svd(A)
S = numpy.zeros((m, n))
numpy.fill_diagonal(S, sdiag)
V = VH.T.conj()  # if you know you have real values only you can leave out the .conj()