2012-06-09 42 views
3

真的很困惑为什么使用RcppArmadillo的QR输出与R的QR输出不同?犰狳文件也没有给出明确的答案。基本上,当我给R一个n * q(比如1000 X 20)的矩阵Y时,我得到Q是1000 X 20和R 20 X 1000.这就是我所需要的。但是当我在Armadillo中使用QR解算器时,它将我抛回Q 1000 X 1000和R 1000 X 20.我可以改用R的qr函数吗?我需要Q具有维数n x q,而不是q x q。下面的代码是我正在使用的(它是更大功能的一部分)。QR分解RcppArmadillo

如果有人可以建议如何在RcppEigen中做到这一点,那也是有帮助的。

library(inline) 
library(RcppArmadillo) 

src <- ' 
    Rcpp::NumericMatrix Xr(Xs); 
    int q = Rcpp::as<int>(ys); 

    int n = Xr.nrow(), k = Xr.ncol(); 
    arma::mat X(Xr.begin(), n, k, false); 

    arma::mat G, Y, B; 

    G = arma::randn(n,q); 

    Y = X*G; 

    arma::mat Q, R; 
    arma::qr(Q,R,Y); 

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


rsvd <- cxxfunction(signature(Xs="numeric", ys="integer"), body=src, plugin="RcppArmadillo") 
+3

R的'qr()'函数不直接返回'Q'矩阵。相反,您需要使用'qr.Q(qr(m))',并且返回的矩阵的维数将取决于'complete ='参数的值。试试看看我的意思:'m < - matrix(rnorm(10),ncol = 2); qr.Q(QR(M)); qr.Q(qr(m),complete = TRUE)'。第一次调用'qr.Q()'返回一个5x2矩阵,而第二次返回完整的5x5 Q矩阵。难道RcppArmadillo会返回完整的1000x1000 Q矩阵,而不仅仅是它的前20列(默认为'qr.Q()')? ('qr.R()'也有一个'complete ='arg,出于同样的原因。) –

+0

你对使用qr.Q()是正确的,我实际上在R版本中使用它。你是对的,RcppArmadillo会返回完整的1000X1000。 – pslice

+0

@ JoshO'Brien +1点。如果您将该答案准备为OP可以接受的答案,我们可以成功关闭此答案。 –

回答

6

(注:这个答案解释了为什么不同尺寸R和RcppArmadillo回报矩阵,而不是如何让RcppArmadillo返回1000 * 20矩阵的R确实对于这一点,也许看看所使用的策略。附近的qr.Q()函数定义的底部。)


的r qr()函数不直接返回Q值。对于这一点,你需要使用qr.Q(),像这样:

m <- matrix(rnorm(10), ncol=2) 
qr.Q(qr(m)) 
#    [,1]  [,2] 
# [1,] -0.40909444 0.05243591 
# [2,] 0.08334031 -0.07158896 
# [3,] 0.38411959 -0.83459079 
# [4,] -0.69953918 -0.53945738 
# [5,] -0.43450340 0.06759767 

注意qr.Q()返回同一维度的矩阵m,而不是一个完整的5 * 5 Q矩阵。您可以使用complete=参数来控制这种行为,并得到全尺寸的Q矩阵:

qr.Q(qr(m), complete=TRUE) 
#    [,1]  [,2]  [,3]  [,4]  [,5] 
# [1,] -0.40909444 0.05243591 0.3603937 -0.7158951 -0.43301590 
# [2,] 0.08334031 -0.07158896 -0.8416121 -0.5231477 0.07703927 
# [3,] 0.38411959 -0.83459079 0.2720003 -0.2389826 0.15752300 
# [4,] -0.69953918 -0.53945738 -0.2552198 0.3453161 -0.18775072 
# [5,] -0.43450340 0.06759767 0.1506125 -0.1935326 0.86400136 

对你来说,这听起来像RcppArmadillo正在恢复满1000×1000 Q矩阵(如qr.Q(q(m, complete=FALSE))会),而不是只是其前20列(如qr.Q(q(m))会)。