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
Я знаю, что они используют один и тот же алгоритм, почему есть разница в знаках?
Благодаря
Ответы
Ответ 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, что не указывает на проблему.