在我的Python代码中,我正在使用numpy.linalg.svd计算一些数据的奇异值分解:
from numpy import linalg
(_, _, v) = linalg.svd(m)
这返回的 V 矩阵是:
[[ 0.4512937 -0.81992002 -0.35222884]
[-0.22254721 0.27882908 -0.93419863]
[ 0.86417981 0.4999855 -0.05663711]]
在将我的代码移植到C++时,我转而使用Armadillo来计算SVD:
#include <armadillo>
arma::fmat M; // Input data
arma::fmat U;
arma::fvec S;
arma::fmat V;
arma::svd(U, S, V, M);
相同数据的结果 V 是:
0.4513 -0.2225 -0.8642
-0.8199 0.2788 -0.5000
-0.3522 -0.9342 0.0566
我们可以看到,Armadillo的V的转置与NumPy的V相匹配。除了Armadillo的V的最后一列之外。这些值与NumPy结果的最后一行的值的符号相反。
发生了什么?为什么两个流行库的SVD结果会有这样的差异?哪一个是正确的结果?
armadillo
是正确的。你能发一下原始矩阵吗? - sbabbiV
,而numpy返回V*
。至于符号的变化,我不知道,但可能两个结果都是正确的,并且V
中的符号变化被U
中的另一个符号变化所平衡。您可以计算USV并检查它是否等于您的原始矩阵。 - sbabbi