Действительно смущен, почему вывод QR с использованием RcppArmadillo отличается от вывода QR из R; Документация Armadillo также не дает четкого ответа. По сути, когда я даю R матрицу Y, которая равна n * q (скажем, 1000 X 20), я возвращаю Q, которая равна 1000 X 20 и R 20 X 1000. Это то, что мне нужно. Но когда я использую решатель QR в Armadillo, он отбрасывает меня обратно на 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")
qr()
языка R не возвращает напрямую матрицу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, а второй возвращает полную Q-матрицу 5x5. Может быть, RcppArmadillo возвращает полную матрицу Q 1000x1000, а не только ее первые 20 столбцов (какqr.Q()
по умолчанию)? (qr.R()
также имеет аргументcomplete=
по той же причине.) - person Josh O'Brien   schedule 09.06.2012qr.Q
. - person Josh O'Brien   schedule 10.06.2012