В моем коде Python я вычислял SVD некоторых данных, используя 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
Мы видим, что транспонирование V из Armadillo соответствует V из NumPy. Разве что для последнего столбца V от Armadillo. Эти значения имеют противоположный знак значений в последней строке результата NumPy.
Что здесь происходит? Почему результаты SVD для двух популярных библиотек так различаются? И какой из двух правильный результат?
armadillo
в этом правильно. Можешь выложить исходную матрицу? - person sbabbi   schedule 21.11.2013V
, а numpy возвращаетV*
. Что касается смены знака, я понятия не имею, но, вероятно, оба результата верны, и эта смена знака вV
уравновешивается другой вU
. Вы можете вычислить USV и проверить, что он равен вашей исходной матрице. - person sbabbi   schedule 21.11.2013