2012-08-08 97 views
2

我發現下面的R代碼使用qr因式分解不能恢復原始矩陣。我無法弄清楚爲什麼。R高斯消除和qr分解

a <- matrix(runif(180),ncol=6) 
a[,c(2,4)] <- 0 
b <- qr(a) 
d <- qr.Q(b) %*% qr.R(b) 

然後d是所有零列移到右側的方式,從不同a。看起來qr分解不保留行空間。

+2

您也可以使用'qr.X'來恢復原始矩陣'qr.X(b)' – dickoa 2012-08-08 13:14:34

回答

4

當您閱讀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" 

因此,你需要申請pivotapivotd逆正確地排列在矩陣起來。所以

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

+1

好的解釋。我覺得樞軸機制在R中沒有很好的記錄。 – 2012-08-09 02:27:18