gpt4 book ai didi

r - RcppArmadillo 中的 QR 分解

转载 作者:行者123 更新时间:2023-12-01 11:00:50 27 4
gpt4 key购买 nike

真的很困惑为什么使用 RcppArmadillo 的 QR 输出与 R 的 QR 输出不同; Armadillo 文档也没有给出明确的答案。本质上,当我给 R 一个矩阵 Y 是 n * q (比如 1000 X 20 )时,我得到 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。下面的代码是我正在使用的(它是更大功能的一部分)。

如果有人可以建议如何在 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 和 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

请注意, 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)) 会)。

关于r - RcppArmadillo 中的 QR 分解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10964047/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com