我发现使用qr
分解的以下R
代码无法恢复原始矩阵。我不知道为什么。
a <- matrix(runif(180),ncol=6)
a[,c(2,4)] <- 0
b <- qr(a)
d <- qr.Q(b) %*% qr.R(b)
那么d
与a
不同的地方在于,所有的零列都被移动到右侧。似乎qr
分解并未保留行空间。
我发现使用qr
分解的以下R
代码无法恢复原始矩阵。我不知道为什么。
a <- matrix(runif(180),ncol=6)
a[,c(2,4)] <- 0
b <- qr(a)
d <- qr.Q(b) %*% qr.R(b)
那么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
应用于 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
的结果。
qr.X
来恢复原始矩阵qr.X(b)
。 - dickoa