Я пытаюсь воспроизвести какой-то большой проект, написанный на Matlab, с использованием Python.
Мне удалось воспроизвести большинство результатов, но у меня есть проблема именно с разложением SVD.
(Я смотрю только на последнюю, V, часть.)
В Matlab:
[~, ~, V] = svd([4.719, -17.257, -11.5392; -17.2575, 63.9545, 40.5581; -11.5392, 40.5581, 31.3256]);
Это дает мне следующее V:
-0.2216 0.0241 -0.9748
0.8081 -0.5549 -0.1974
0.5457 0.8316 -0.1035
в numpy:
np.linalg.svd(np.array([[4.71993, -17.2575, -11.539], [-17.257, 63.954, 40.558], [-11.539, 40.558, 31.325]]))[2]
Получает меня:
array([[-0.22159139, 0.80814521, 0.54570924],
[ 0.02407525, -0.55491709, 0.83155722],
[ 0.97484237, 0.19740401, 0.10350855]])
Который транспонирован (как я думаю, ожидается между numpy и matlab), но также отличается по некоторым знакам минус.
даже используя opencv (cv2) или scipy (даже с lapack_driver = "gesvd") все равно получает тот же результат
scipy.linalg.svd(np.array([[4.71993, -17.2575, -11.539], [-17.257, 63.954, 40.558], [-11.539, 40.558, 31.325]]), lapack_driver="gesvd")[2]
Я также попытался транспонировать входную матрицу, которая не сильно изменилась.
Я понимаю, что оба ответа верны. Но мне действительно нужно получить точно такой же результат, чтобы иметь возможность воспроизвести проект.