Вычислительный Nullspace от USV - PullRequest
0 голосов
/ 28 апреля 2019

Я пытаюсь вычислить правильное NullSpace, K, матрицы Matrix S, используя язык R, но закодированная программа вернула только 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 голосов
/ 28 апреля 2019

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

...