在Python中复现Matlab的SVD

3

我正在尝试使用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]

我也尝试了将输入矩阵转置,但变化不大。

我知道这两个答案都是正确的。但我真的需要得到完全相同的结果才能重新生成该项目。


2
4.719 != 4.71993 是您矩阵中的第一个元素。 - karakfa
1个回答

4

在两个环境中,矩阵的表示不同(数值精度不同)。如果使用相同的矩阵,则应该是等效的(转置)。

>> a=[[4.71993, -17.2575, -11.539]; [-17.257, ...
a =

    4.7199  -17.2575  -11.5390
  -17.2570   63.9540   40.5580
  -11.5390   40.5580   31.3250

>> [~,~,v]=svd(a);
>> v'
ans =

  -0.221591   0.808145   0.545709
   0.024075  -0.554917   0.831557
   0.974842   0.197404   0.103509

使用Python

import numpy as np

np.set_printoptions(precision=6)
a=[[4.71993, -17.2575, -11.539], [-17.257, ...
np.linalg.svd(np.array(a))[2]

array([[-0.221591,  0.808145,  0.545709],
       [ 0.024075, -0.554917,  0.831557],
       [ 0.974842,  0.197404,  0.103509]])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接