【发布时间】:2012-06-13 09:50:48
【问题描述】:
真的很困惑为什么使用 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 的
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。
-
@JoshO'Brien +1 现场。如果您将其准备为 OP 可以接受的答案,我们可以成功关闭此答案。
-
我对使用 RcppArmadillo/C++ 有点陌生,那么在执行 QR 后我将如何重新定义 Q 使其只是前 20 列?
-
@pslice -- 我没有用过 RcppArmadillo 或 C++,所以不能直接说。如果你想做一些事情而不是做完整的 Q 然后扔掉除第一个 20 列之外的所有列,也许看看
qr.Q的最后几行中使用的策略。
标签: r rcpp decomposition armadillo