从USV计算零空间

时间:2019-04-28 13:07:59

标签: r svd

我正在尝试使用R语言计算矩阵S的正确NullSpace K,但是编码程序仅返回NULL,我该怎么办?


r1<-c(1,0,0,0)
r2<-c(-1,1,0,0)
r3<-c(0,-1,1,0)
r4<-c(0,-1,0,1)
r5<-c(0,0,-1,0)
r6<-c(0,0,0,-1)
S<-cbind(r1,r2,r3,r4,r5,r6)
m<-ncol(S)
n<-nrow(S)


K<-null(t(S))= Null

# [IN Octave] K=null(S');
 K = 
   0.308572   0.487972
   0.308572   0.487972
   0.576882  -0.023245
  -0.268311   0.511217
   0.576882  -0.023245
  -0.268311   0.51121

1 个答案:

答案 0 :(得分:0)

1)空请注意,MASS随R一起提供,因此您无需安装它。内部Null使用QR分解。

library(MASS)
Null(t(S))

给予:

           [,1]       [,2]
[1,]  0.4218763  0.3941493
[2,]  0.4218763  0.3941493
[3,]  0.5522815 -0.1682810
[4,] -0.1304052  0.5624303
[5,]  0.5522815 -0.1682810
[6,] -0.1304052  0.5624303

2)svd 如果在主题中使用USV,您的意思是要从奇异值分解中获取它,那么:

SVD <- svd(crossprod(S))
Rank <- sum(zapsmall(SVD$d) > 0)
SVD$v[, -seq_len(Rank)]

给予:

           [,1]        [,2]
[1,]  0.2077046 -0.53869484
[2,]  0.2077046 -0.53869484
[3,]  0.5703757 -0.08946994
[4,] -0.3626711 -0.44922489
[5,]  0.5703757 -0.08946994
[6,] -0.3626711 -0.44922489

3)特征值或来自S'S的特征值分解,然后:

e <- eigen(crossprod(S))
Rank <- sum(zapsmall(e$values) > 0)
e$vectors[, -seq_len(Rank)]

给予:

     [,1]      [,2]
[1,]  0.0 0.5773503
[2,]  0.0 0.5773503
[3,] -0.5 0.2886751
[4,]  0.5 0.2886751
[5,] -0.5 0.2886751
[6,]  0.5 0.2886751

对于其中的任何一个乘以S,以验证S确实确实将其中的任何一个带到空空间。