Я использую 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
Octave
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
Я новичок в Octave и R, поэтому мой первый вопрос: правильно ли я это делаю? Если да, то какой из них «правильный»? Они оба правы? Я также попробовал это в numpy и вызове функций LAPACK dgesdd и dgesvd напрямую. Numpy дает мне ответ, похожий на Octave, а вызов функций LAPACK дает мне ответ, похожий на R.
Спасибо!