在 python 中重现 Matlab 的 SVD
Reproduce Matlab's SVD in python
我正在尝试使用 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 重现一些用 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]])