我想知道如何归还' 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程序员,也无法弄清楚这个紧凑的表单是如何创建的。类似的问题被问到here和here,但我还没有找到解决方法。这里的最终目标是:
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;是我想要理解的。
答案 0 :(得分:1)
我不理解qr
返回的压缩表单,但您可以轻松地从对象中提取Q
和R
矩阵:
qr.Q(qr(mat))
qr.R(qr(mat))
您会发现它们与Rcpp返回的内容相匹配。
我查看了手册,但我不能用它做头或尾。 qr.Q
的实际函数只调用Fortran函数,我无法解析它。