3

RcppArmadillo を使用した QR 出力が R からの QR 出力と異なる理由は本当に混乱しています。Armadillo のドキュメントにも明確な答えはありません。基本的に、R に n * q (たとえば 1000 X 20 ) である行列 Y を指定すると、1000 X 20 および R 20 X 1000 である Q が返されます。これが必要です。しかし、Armadillo で QR ソルバーを使用すると、Q 1000 X 1000 と R 1000 X 20 がスローされます。代わりに R の qr 関数を呼び出すことはできますか? qx q ではなく、次元 nxq を持つ 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")
4

1 に答える 1

6

(注: この回答は、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

は、完全な 5*5 Q 行列ではなく、qr.Q()と同じ次元の行列を返すことに注意してください。m引数を使用して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

qr.Q(q(m, complete=FALSE))あなたの場合、RcppArmadillo は、最初の20 列だけではなく、完全な 1000x1000 Q マトリックスを返しているようです ( qr.Q(q(m))would のように)。

于 2012-06-09T20:56:22.617 に答える