Python v / s MATLAB中的SVD命令

时间:2018-06-19 14:30:11

标签: python svd

我有m = 10, n = 5, A=randn(m,n);[U,S,V]=svd(A);,这会在MATLAB中返回完整的10x5 S矩阵,而Python仅将S作为5x1数组返回。如何在Python中恢复完整的S矩阵?我尝试过在线查找一些StackOverflow帖子,但令人惊讶的是,这并没有阐明。

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

非常感谢。

2 个答案:

答案 0 :(得分:0)

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

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

S.shape = (5,)是正确的。

您还想要与A = 4x2S = 4×2相似的B = np.zeros(A.shape)

为此,您定义一个矩阵i==j。然后用S元素填充其对角线。对角线是指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)]) 或更紧凑的形式:

{{1}}

我希望对您有帮助

对于第二个问题,我使用gedit(标准文本编辑器)在https://www.mathworks.com/help/matlab/ref/svd.html shell中运行代码。

您也可以看看ipython

答案 1 :(得分:0)

矩阵的SVD可以写为

A = U S V^H

其中^ H表示this one。 Matlab的svd命令返回U,S和V,而numpy.linalg.svd返回U,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()