r语言 - 犰狳中的 QR 分解



真的很困惑为什么使用 RcppArmadillo 的 QR 输出与 R 的 QR 输出不同;犰狳文档也没有给出明确的答案。基本上,当我给R一个矩阵Y是n * q(比如1000 X 20)时,我得到的Q是1000 X 20和R 20 X 1000。这就是我需要的。但是当我在犰狳中使用 QR 求解器时,它会让我回到 Q 1000 X 1000 和 R约1000 X 20。我可以调用 R 的 QR 函数吗?我需要 Q 具有维度 n x q,而不是 q x 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")

(注意:这个答案解释了为什么R和Rcpp犰狳返回不同维度的矩阵,而不是如何让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

请注意,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 正在返回完整的 1000x1000 Q 矩阵(就像qr.Q(q(m, complete=FALSE))一样),而不仅仅是它的第一 20 列(就像qr.Q(q(m))一样)。

最新更新