R高斯消元和qr分解

时间:2012-08-08 12:31:50

标签: r matrix linear-algebra

我发现使用R因子分解的以下qr代码无法恢复原始矩阵。我无法弄清楚原因。

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

然后da的不同之处在于所有零列都在右侧移动。似乎qr因子分解不会保留行空间。

1 个答案:

答案 0 :(得分: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"

因此,您需要将pivot应用于a或将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