因数分解を使用した次のR
コードでqr
は、元の行列を復元できないことがわかりました。理由がわかりません。
a <- matrix(runif(180),ncol=6)
a[,c(2,4)] <- 0
b <- qr(a)
d <- qr.Q(b) %*% qr.R(b)
thenは、すべてのゼロ列が右側に移動される方法とd
は異なります。因数分解は行スペースを保持していないようですa
。qr
因数分解を使用した次のR
コードでqr
は、元の行列を復元できないことがわかりました。理由がわかりません。
a <- matrix(runif(180),ncol=6)
a[,c(2,4)] <- 0
b <- qr(a)
d <- qr.Q(b) %*% qr.R(b)
thenは、すべてのゼロ列が右側に移動される方法とd
は異なります。因数分解は行スペースを保持していないようですa
。qr
ヘルプを読むと、qr
R がピボットされた QR 分解を使用していることがわかります。そう
str(b)
与える
List of 4
$ qr : num [1:30, 1:6] -3.2292 0.218 0.0623 0.0371 0.302 ...
$ rank : int 4
$ qraux: num [1:6] 1.05 1.11 1.04 1.22 0 ...
$ pivot: int [1:6] 1 3 5 6 2 4
- attr(*, "class")= chr "qr"
したがって、行列を正しく並べるには、pivot
toまたはtoa
の逆を適用する必要があります。そうpivot
d
pivots <- b$pivot
d.ok <- d[,order(pivots)]
all.equal(a,d.ok)
与える
[1] TRUE
あなたもできる
a.p <- a[,pivots]
all.equal(a.p,d)
これも になりTRUE
ます。