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) eigen или из разложения по собственным значениям 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
, фактически, переводит любое из них в нулевое пространство.