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

时间:2012-04-06 01:50:36

标签: r matrix

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

1 个答案:

答案 0 :(得分:1)

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]))
  }
}

我通过随机设置矩阵大小和稀疏度进行测试,它们运行顺畅。然而,这种风格“只是让它工作而不知道为什么”,并且仅在此处发布以供讨论。因为我没有入侵“Matrix”包的实现细节。