Действительно смущает, почему вывод 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. Можно ли вместо этого вызвать функцию qr q? Мне нужно Q, чтобы иметь размерность n x q, а не q x q. Код ниже - это то, что я использую (его часть большей функции).QR-декомпозиция в RcppArmadillo
Если кто-то может предложить, как это сделать в 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 (м)); qr.Q (qr (m), complete = TRUE) '. Первый вызов 'qr.Q()' возвращает матрицу 5x2, а вторая возвращает полную матрицу 5x5 Q. Может ли быть, что RcppArmadillo возвращает полную 1000x1000 Q-матрицу, а не только ее 1-й 20 столбцов (как 'qr.Q()' по умолчанию)? ('qr.R()' также имеет 'complete =' arg, по той же причине.) –
Вы правы в использовании qr.Q(), я действительно использую его в R-версии. Вы правы, RcppArmadillo возвращает полный 1000X1000. – pslice
@ JoshO'Brien +1 место на. Если вы подготовите это как ответ, который может принять OP, мы сможем успешно завершить этот вариант. –