Cli*_*ive 9 numpy r octave svd lapack
我正在使用Octave和R来使用简单的矩阵计算SVD并得到两个不同的答案!代码如下:
[R
> a<-matrix(c(1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1), 9, 4)
> a
[,1] [,2] [,3] [,4]
[1,] 1 1 0 0
[2,] 1 1 0 0
[3,] 1 1 0 0
[4,] 1 0 1 0
[5,] 1 0 1 0
[6,] 1 0 1 0
[7,] 1 0 0 1
[8,] 1 0 0 1
[9,] 1 0 0 1
> a.svd <- svd(a)
> a.svd$d
[1] 3.464102e+00 1.732051e+00 1.732051e+00 1.922963e-16
> a.svd$u
[,1] [,2] [,3] [,4]
[1,] -0.3333333 0.4714045 -1.741269e-16 7.760882e-01
[2,] -0.3333333 0.4714045 -3.692621e-16 -1.683504e-01
[3,] -0.3333333 0.4714045 -5.301858e-17 -6.077378e-01
[4,] -0.3333333 -0.2357023 -4.082483e-01 6.774193e-17
[5,] -0.3333333 -0.2357023 -4.082483e-01 6.774193e-17
[6,] -0.3333333 -0.2357023 -4.082483e-01 6.774193e-17
[7,] -0.3333333 -0.2357023 4.082483e-01 5.194768e-17
[8,] -0.3333333 -0.2357023 4.082483e-01 5.194768e-17
[9,] -0.3333333 -0.2357023 4.082483e-01 5.194768e-17
> a.svd$v
[,1] [,2] [,3] [,4]
[1,] -0.8660254 0.0000000 -4.378026e-17 0.5
[2,] -0.2886751 0.8164966 -2.509507e-16 -0.5
[3,] -0.2886751 -0.4082483 -7.071068e-01 -0.5
[4,] -0.2886751 -0.4082483 7.071068e-01 -0.5
Run Code Online (Sandbox Code Playgroud)
八度
octave:32> a = [ 1, 1, 1, 1, 1, 1, 1, 1, 1; 1, 1, 1, 0, 0, 0, 0, 0, 0; 0, 0, 0, 1, 1, 1, 0, 0, 0; 0, 0, 0, 0, 0, 0, 1, 1, 1 ]
a =
1 1 1 1 1 1 1 1 1
1 1 1 0 0 0 0 0 0
0 0 0 1 1 1 0 0 0
0 0 0 0 0 0 1 1 1
octave:33> [u, s, v] = svd (a)
u =
-8.6603e-01 -1.0628e-16 2.0817e-17 -5.0000e-01
-2.8868e-01 5.7735e-01 -5.7735e-01 5.0000e-01
-2.8868e-01 -7.8868e-01 -2.1132e-01 5.0000e-01
-2.8868e-01 2.1132e-01 7.8868e-01 5.0000e-01
s =
Diagonal Matrix
3.4641e+00 0 0 0 0
0 1.7321e+00 0 0 0
0 0 1.7321e+00 0 0
0 0 0 3.7057e-16 0
0 0 0 0 0
v =
-3.3333e-01 3.3333e-01 -3.3333e-01 7.1375e-01
-3.3333e-01 3.3333e-01 -3.3333e-01 -1.3472e-02
-3.3333e-01 3.3333e-01 -3.3333e-01 -7.0027e-01
-3.3333e-01 -4.5534e-01 -1.2201e-01 -9.0583e-17
-3.3333e-01 -4.5534e-01 -1.2201e-01 2.0440e-17
-3.3333e-01 -4.5534e-01 -1.2201e-01 2.0440e-17
-3.3333e-01 1.2201e-01 4.5534e-01 8.3848e-17
-3.3333e-01 1.2201e-01 4.5534e-01 8.3848e-17
-3.3333e-01 1.2201e-01 4.5534e-01 8.3848e-17
Run Code Online (Sandbox Code Playgroud)
我是Octave和R的新手,所以我的第一个问题是我做得对吗?如果是这样,哪一个是"正确的"?他们都是对的吗?我也在numpy中尝试了这个并直接调用LAPACK函数dgesdd和dgesvd.Numpy给我一个类似于Octave的答案,调用LAPACK函数给出了类似于R的答案.
谢谢!
在SVD分解中,$ A = UDV ^ T $只有$ D $是唯一的(直到重新排序).或多或少地容易看出$ cU $和$\frac {1} {c} V $会给出相同的分解.因此,不同的算法可以给出不同的结果也就不足为奇了.重要的是所有算法的$ D $必须相同.
归档时间: |
|
查看次数: |
2029 次 |
最近记录: |