2012-06-09 2 views
3

RcppArmadillo를 사용한 QR 출력이 R의 QR 출력과 다른 이유는 무엇입니까? Armadillo 설명서는 명확한 답을 제공하지 않습니다. 본질적으로 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가 q x q가 아닌 n x q 차원을 가질 필요가 있습니다. 아래 코드는 내가 사용하고있는 것 (더 큰 기능의 일부)입니다.RcppArmadillo의 QR 분해

누군가가 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); q ㆍ Q (qr (m)); qr.Q (qr (m), 완료 = TRUE)'. qr.Q()에 대한 첫 번째 호출은 5x2 행렬을 반환하고, 두 번째 호출은 전체 5x5 Q 행렬을 반환합니다. RcppArmadillo가 처음 20 컬럼 (qr.Q()는 기본적으로)이 아닌 전체 1000x1000 Q 매트릭스를 리턴 할 수 있습니까? ('qr.R()'도 같은 이유로'complete ='arg를가집니다.) –

+0

qr.Q()를 사용하는 것이 옳습니다. 실제로 R 버전에서 사용합니다. 당신 말이 맞아요, RcppArmadillo 전체 1000X1000을 반환합니다. – pslice

+0

@ JoshO'Brien +1 spot on. OP가 수락 할 수있는 답변으로 준비하면이 질문을 성공적으로 닫을 수 있습니다. –

답변

6

(참고 :이 대답은 다른 차원에 왜 R과 RcppArmadillo 반환 행렬을 설명하고 있지만 RcppArmadillo는 R은이를 위해 아마도 사용하는 전략을 살펴 않습니다 1000 * 20 행렬을 반환하는 방법을. qr.Q() 함수 정의의 하단.)


R의 qr() 기능은 Q에게 직접 반환하지 않습니다. 이를 위해이 같은 qr.Q()를 사용해야합니다 : qr.Q() 오히려 전체 5 * 5 Q 행렬보다 m으로 동일한 차원의 매트릭스를 반환

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 

공지있다. 이 동작을 제어 할 수 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처럼 들린다는 것이 아니라, (같은 qr.Q(q(m, complete=FALSE))는 것) 전체 1000x1000 Q 행렬을 반환 첫 번째 20 열 (예 : qr.Q(q(m))).