python - 在 python 中重现 Matlab 的 SVD

标签 python matlab numpy scipy svd

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

我还尝试转置输入矩阵,结果变化不大。

我知道这两个答案都是正确的。但我确实需要获得完全相同的结果才能重现该项目。

最佳答案

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

>> 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]])

关于python - 在 python 中重现 Matlab 的 SVD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52105389/

相关文章:

Python:读取文件直到一行以二进制模式匹配字符串

python - ffmpeg rtmp 在 youtube 上播放速度低于 1x

python - 运行 setup.py 时更改包名称

matlab - 使用 Ransac 的仿射模型

matlab - 在 MATLAB 2014 中使用 'imhist' 时出错

python - 使用 Numpy 逐元素矩阵的阶乘

python - 使用 SQLALCHEMY 设置 Oracle VARCHAR2 长度 i 字节

matlab - 如何使用 matlab 在矩阵中找到唯一(非重复)值

python - 使用 Gekko 的 ARX 模型的 MPC

python - NumPy 的向量化和自动向量化之间的区别