SVD вычисляет другой результат в Matlab и OpenCV

Интересно, почему для вычислений SVD в Matlab и OpenCV существует разница в знаках. Я ввожу ту же матрицу

          3.65E+06  -2.09E+06   0
 YY =    -2.09E+06  2.45E+06    0
           0         0          0

[U,S,V] = svd(YY);//Matlab


        -0.798728902689475  0.601691066917623   0
   V =  0.601691066917623   0.798728902689475   0
         0                  0                   1

cv::SVD::compute(YY, S, U, V);//opencv

     0.798839   -0.601544   0
V =  0.601544   0.798839    0
     0          0           1

Я знаю, что они используют один и тот же алгоритм, почему существует разница в знаках? Спасибо


person Bryanyan    schedule 17.04.2013    source источник


Ответы (3)


Какую версию OpenCV вы используете?

Из http://code.opencv.org/issues/1498 кажется, что в последних версиях OpenCV нет больше не используйте LAPACK для выполнения SVD (я думаю, что он используется в Matlab). Таким образом, предположение, что используется один и тот же алгоритм, может быть неверным.

Конечно YY=USV'

Если вы отрицаете первые столбцы U и V:

U(:,1)=-U(:,1);
V(:,1)=-V(:,1)

Вы обнаружите, что USV' по-прежнему равно YY. Это работает для вашего конкретного случая, потому что YY симметричен (YY=YY').

person Bull    schedule 19.04.2013

Результаты SVD не обязательно должны быть уникальными. Например, I = UIV' для любого унитарного V = U. Приведенный выше пример, в частности, не имеет ранга, поэтому нет причин ожидать уникальности.

person willem    schedule 23.07.2014

Разложение по единственному значению определено только до знака; знаки U и V произвольны, и если они различаются между MATLAB и OpenCV, это не указывает на проблему.

person Sam Roberts    schedule 18.05.2014