我正在尝试使用Python重现一些用Matlab编写的大型项目。 我已经成功地复制了大多数结果,但是在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]
我也尝试了将输入矩阵转置,但变化不大。
我知道这两个答案都是正确的。但我真的需要得到完全相同的结果才能重新生成该项目。
4.719 != 4.71993
是您矩阵中的第一个元素。 - karakfa