psl*_*ice 3 r decomposition armadillo rcpp
真的很困惑为什么使用RcppArmadillo的QR输出与R的QR输出不同; 犰狳文献也没有给出明确的答案.基本上当我给R一个n*q的矩阵Y(比如1000 X 20)时,我得到的Q是1000 X 20和R 20 X 1000.这就是我需要的.但是当我在Armadillo中使用QR求解器时,它会让我回到Q 1000 X 1000和R 1000 X 20.我可以调用R的qr函数吗?我需要Q有维度nxq,而不是qx q.下面的代码是我正在使用的(它是更大功能的一部分).
如果有人可以建议如何在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")
Run Code Online (Sandbox Code Playgroud)
(注意:这个答案解释了为什么R和RcppArmadillo返回具有不同维度的矩阵,而不是如何使RcppArmadillo返回R所做的1000*20矩阵.为此,或许可以看一下在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
Run Code Online (Sandbox Code Playgroud)
请注意,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
Run Code Online (Sandbox Code Playgroud)
在你的情况下,听起来像RcppArmadillo正在返回完整的1000x1000 Q矩阵(就像qr.Q(q(m, complete=FALSE))那样),而不仅仅是它的前20列(就像qr.Q(q(m))那样).