我正在尝试使用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
答案 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
确实确实将其中的任何一个带到空空间。