R高斯消元和qr分解

3

我发现使用qr分解的以下R代码无法恢复原始矩阵。我不知道为什么。

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

那么da不同的地方在于,所有的零列都被移动到右侧。似乎qr分解并未保留行空间。


2
您也可以使用 qr.X 来恢复原始矩阵 qr.X(b) - dickoa
1个回答

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 或将逆矩阵应用于 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的结果。

2
好的解释。我觉得在R中,旋转机制没有被很好地记录。 - user1539634

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接