基础R`qr`如何创建QR分解紧凑形式?

时间:2015-03-02 21:12:17

标签: r qr-decomposition

我想知道如何归还' compact'使用RcppArmadillo从QR分解形成。使用RcppArmadillo使用以下内容在矩阵上运行QR分解相对简单:

library(inline)

src <- '
using namespace Rcpp;
using namespace arma;
mat X = as<mat>(A);
mat Q, R;

qr(Q,R,X);

return Rcpp::List::create(Rcpp::Named("Q")=Q,Rcpp::Named("R")=R);
'

fun <- cxxfunction(signature(A = "matrix"), src, plugin="RcppArmadillo")

然而,当我将fun的输出与正常的R qr方法进行比较时,我被“契约”&#39;由qr$qr返回的矩阵。

mat <- matrix(seq(9), 3)

# Armadillo method
fun(mat)
$Q
           [,1]       [,2]       [,3]
[1,] -0.2672612  0.8728716  0.4082483
[2,] -0.5345225  0.2182179 -0.8164966
[3,] -0.8017837 -0.4364358  0.4082483

$R
          [,1]      [,2]          [,3]
[1,] -3.741657 -8.552360 -1.336306e+01
[2,]  0.000000  1.963961  3.927922e+00
[3,]  0.000000  0.000000  2.220446e-15

# normal R method
qr(mat)$qr
           [,1]      [,2]          [,3]
[1,] -3.7416574 -8.552360 -1.336306e+01
[2,]  0.5345225  1.963961  3.927922e+00
[3,]  0.8017837  0.988693  1.776357e-15

我试过在R源dqrdc2.f中查找旧的Fortran,但我不是一个强大的Fortran程序员,也无法弄清楚这个紧凑的表单是如何创建的。类似的问题被问到herehere,但我还没有找到解决方法。这里的最终目标是:

all.equal(fun(mat), qr(mat)$qr)

如果我能够了解这种紧凑形式,那么fun的输出就会被修改。

修改

qr报告的文档:

Value

The QR decomposition of the matrix as computed by 
LINPACK or LAPACK. The components in the returned value correspond 
directly to the values returned by DQRDC/DGEQP3/ZGEQP3.

qr  
a matrix with the same dimensions as x. The upper triangle contains the 
\bold{R} of the decomposition and the lower triangle contains information 
on the \bold{Q} of the decomposition (stored in compact form). Note that 
the storage used by DQRDC and DGEQP3 differs.

这个&#34;下三角&#34;是我想要理解的。

1 个答案:

答案 0 :(得分:1)

我不理解qr返回的压缩表单,但您可以轻松地从对象中提取QR矩阵:

qr.Q(qr(mat))
qr.R(qr(mat))

您会发现它们与Rcpp返回的内容相匹配。

我查看了手册,但我不能用它做头或尾。 qr.Q的实际函数只调用Fortran函数,我无法解析它。