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.svd
returnsU,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()
我在 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.svd
returnsU,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()