gpt4 book ai didi

r - 如何对Matrix包中的“sparseMatrix”类的对象进行QR分解?

转载 作者:行者123 更新时间:2023-12-02 04:02:07 26 4
gpt4 key购买 nike

我想用Matrix:::qr()创建的矩阵上的B<-as(A, "sparseMatrix")函数进行QR分解。我知道我可以使用Matrix:::qr.R()获得R矩阵。但是,我还需要Q矩阵。 Matrix软件包中似乎没有qr.Q()函数。如何获得Q矩阵?

最佳答案

Q矩阵实际上存储在V插槽中。似乎当前的R Matrix版本包含一个错误-在执行qr分解之前,它只是神秘地在矩阵a中添加了零行。我希望开发人员可以来解释一下。因此,以下代码可帮助您恢复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]))
}
}

我已经通过随机设置矩阵大小和稀疏度进行了测试,并且它们工作流畅。但是,这是“只是不知道为什么就让它工作”的风格,在此仅发布以供讨论。因为我还没有深入研究“矩阵”包的实现细节。

关于r - 如何对Matrix包中的“sparseMatrix”类的对象进行QR分解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10038276/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com