我想用 QR 分解Matrix:::qr()
我用它创建的矩阵上的函数B<-as(A, "sparseMatrix")
。我知道我可以得到 R 矩阵Matrix:::qr.R()
。不过,我还需要 Q 矩阵。 Matrix包中似乎没有qr.Q()函数。如何获得 Q 矩阵?
The Q
矩阵实际上存储在V
投币口。当前的 R Matrix 版本似乎包含一个错误 --- 它只是神秘地将零行添加到矩阵中a
在进行 qr 分解之前。希望开发商能过来解释一下。因此,以下代码可帮助您恢复 R 和 Q:
gx.qr.Q <- function(a){
if(is(a, "qr")){
return(qr.Q(a, complete = T))
}else if(is(a, "sparseQR")){
Q <- diag(nrow = a@V@Dim[1], ncol = a@V@Dim[1])
for(i in rev(1:a@V@Dim[2])){
Q <- Q - (a@V[ ,i] * a@beta[i]) %*% (a@V[ ,i] %*% Q)
}
return(Q[order(a@p), ][1:a@Dim[1], 1:a@Dim[1]])
}else{
stop(gettextf("gx.qr.Q() fails on class '%s'", class(a)[1]))
}
}
gx.qr.R <- function(a){
if(is(a, "qr")){
return(qr.R(a, complete = T)[ ,order(a$pivot)])
}else if(is(a, "sparseQR")){
if(length(a@q) == 0){
return(a@R[1:a@Dim[1], ])
}else{
return(a@R[1:a@Dim[1] ,order(a@q)])
}
}else{
stop(gettextf("gx.qr.R() fails on class '%s'", class(a)[1]))
}
}
我通过随机设置矩阵大小和稀疏度进行了测试,它们工作顺利。然而,这是“只是让它工作而不知道为什么”的风格,并且发布在这里仅供讨论。因为我还没有侵入“Matrix”包的实现细节。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)