[Rcpp-devel] Best way to create random normal matrix

Julian Smith hilbertspaces at gmail.com
Wed Dec 5 06:57:39 CET 2012


Thanks for the feedback. This should be easy enough to port over to
RcppEigen, right?

On Tue, Dec 4, 2012 at 6:17 PM, Dirk Eddelbuettel <edd at debian.org> wrote:

>
> Julian,
>
> Your prorgam was actually fine as such, but you "used" it wrong -- what
> comes
> back from cxxfunction() is already an R function, see below.
>
> If you use the R RNGs (which is easy from Rcpp) your results are
> reproducible
> with R.  That is all documented so I won't repeat it here.
>
> Dirk
>
> R> library(inline)
> R>
> R> 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);
> +     Q = Q(arma::span::all,arma::span(0,q-1));
> +     B = arma::trans(Q)*X;
> +     arma::vec d;
> +     arma::mat u, v;
> +     arma::svd(u, d, v, B );
> +     arma::mat U = Q*u;
> +     return Rcpp::List::create(Rcpp::Named("d")=d,
> +                               Rcpp::Named("U")=U,
> +                               Rcpp::Named("V")=v);'
> R>
> R> rsvd <- cxxfunction(signature(Xs="numeric", ys="integer"), body=src,
> plugin= "RcppArmadillo")
> R> rsvd(matrix(1:4,2,2), 2)
> $d
>          [,1]
> [1,] 5.464986
> [2,] 0.365966
>
> $U
>          [,1]      [,2]
> [1,] 0.576048 -0.817416
> [2,] 0.817416  0.576048
>
> $V
>          [,1]      [,2]
> [1,] 0.404554  0.914514
> [2,] 0.914514 -0.404554
>
> R>
>
>
> --
> Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20121204/11822b99/attachment.html>


More information about the Rcpp-devel mailing list