在example of wikipedia's page on SVD之后,我在R中创建了以下矩阵:
M <- matrix(0, 4, 5)
M[1, 1] <- 1
M[4, 2] <- 2
M[2, 3] <- 3
M[1, 5] <- 2
从包base
计算SVD:
s <- svd(M)
然而,s$u
是4x4矩阵,s$v
是5x4矩阵,而V应该是5x5矩阵,如维基百科页面(以及该主题的其他页面)。
所以,我有点困惑......
答案 0 :(得分:5)
默认情况下,R不计算所有奇异向量。 (阅读doc)
如果您想要计算所有这些内容,可以使用svd
的参数nu
和nv
。
,例如,在您的情况下:
s = svd(M, nv = 5)
检查:
dim(s$v)
# [1] 5 5
s$u %*% cbind(diag(s$d), rep(0,4)) %*% t(s$v)
# You get M.
更一般地说,你可以通过这种方式获得所有奇异向量:
s = svd(M, nu = nrow(M), nv = ncol(M))
答案 1 :(得分:0)
我的知识id线性代数有些简陋和尘土飞扬,但我认为这个满足了SVD的所有条件。 SVD只不过是三个矩阵中原始矩阵M的因式分解 - 一个对角矩阵d和两个正交矩阵u和v,这样M=udv'
所以唯一的限制是行数v'
应该与u*d
这是代码:
M <- matrix(0, 4, 5)
M[1, 1] <- 1
M[4, 2] <- 2
M[2, 3] <- 3
M[1, 5] <- 2
M
ans<- svd(M)
u<- ans$u
v<- ans$v
d<- ans$d
#u %*% I(u)
u %*% t(u) #Ok, is orthogonal
v %*% t(v) #OK, is orthogonal
d1<- diag(d)
d1
(u%*% d1) %*% t(v) # is same as M
u%*% (d1 %*% t(v)) # is same as M
M