2012-08-08 2 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

답변

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" 

는 따라서 올바르게 행렬을 줄을 pivota에 또는 pivotd의 역을 적용 할 필요가 있습니다. 그래서

pivots <- b$pivot 
d.ok <- d[,order(pivots)] 
all.equal(a,d.ok) 

는 또한 또한 TRUE 결과

a.p <- a[,pivots] 
all.equal(a.p,d) 

을 할 수

[1] TRUE 

을 제공합니다.

+1

좋은 설명. 피벗 메커니즘이 R에 잘 설명되어 있지 않다고 생각합니다. –