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")
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를가집니다.) –
qr.Q()를 사용하는 것이 옳습니다. 실제로 R 버전에서 사용합니다. 당신 말이 맞아요, RcppArmadillo 전체 1000X1000을 반환합니다. – pslice
@ JoshO'Brien +1 spot on. OP가 수락 할 수있는 답변으로 준비하면이 질문을 성공적으로 닫을 수 있습니다. –