真的很困惑为什么使用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")
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,出于同样的原因。) –
你对使用qr.Q()是正确的,我实际上在R版本中使用它。你是对的,RcppArmadillo会返回完整的1000X1000。 – pslice
@ JoshO'Brien +1点。如果您将该答案准备为OP可以接受的答案,我们可以成功关闭此答案。 –