Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Какую версию 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 ').

Ответ 2

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

Ответ 3

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