我有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可能是最常见的。
非常感谢。
答案 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 = 4x2
和S = 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()