[Rcpp-devel] Connection between arma and rcpp

Kevin Ushey kevinushey at gmail.com
Wed Jan 30 00:32:21 CET 2013


Sorry, I misunderstood your questions on first read. I have some replies
in-line.

On Tue, Jan 29, 2013 at 11:20 AM, Honglang Wang
<wanghonglang2008 at gmail.com>wrote:

> Thanks, I am sorry I did not make my point clear. Let me describe it
> clearly:
> 1) The first question is about using "apply":
>
> // [[Rcpp::depends(RcppArmadillo)]]
> #include <RcppArmadillo.h>
> using namespace Rcpp;
>
> // [[Rcpp::export]]
> List foo(NumericVector x, double h) {
>
>   double r = 0.0;
>   for (int i=0; i<100; i++)
>     r += i;
>   r=r+h;
>   return List::create(Named("Sum") = r,
>                             Named("h")=h);
> }
>
> ## For this function, I use two inputs in order to illustrate the problem
> for calling this function by using apply.
>
> // [[Rcpp::export]]
> double fpp(Function f, NumericMatrix Ar, double h) {
>
>   int n = Ar.nrow(), m = Ar.ncol();
>   arma::mat A(Ar.begin(),n,m,false);
>   A.reshape(m,n);
>   arma::mat U(m,1)=f(A,1, function(x) foo(x, h=h)$Sum);
>
>   double r = arma::accu(U);
>   return r;
> }
>
> ## what is the correct format to using f=apply here? exactly the same as
> in R?  The error here is "x" is out of scope.
>

> A <- matrix(rnorm(8),nrow=4)
> fpp(apply, A, 3)
>

There may be a way to do this with some functions in the C++ standard
library but unfortunately I'm not well versed enough. Maybe std::transform?
std::for_each? This entry in the Rcpp gallery might illuminate a bit:
http://gallery.rcpp.org/articles/stl-for-each/


>
> 2) The second question is if i replace using apply by using for loop, how
> to transfer between arma objects and Rcpp objects:
>
> // [[Rcpp::depends(RcppArmadillo)]]
>  #include <RcppArmadillo.h>
> using namespace Rcpp;
>
> // [[Rcpp::export]]
> double foo(NumericVector x) {
>
>   double r = 0.0;
>   for (int i=0; i<100; i++)
>     r += i;
>
>   return r;
> }
>
> // [[Rcpp::export]]
> double fpp(NumericMatrix Ar) {
>
>   int n = Ar.nrow(), m = Ar.ncol();
>   arma::mat A(Ar.begin(),n,m,false);
>   A.reshape(m,n);
>   arma::mat U(m,1);
>   for(int a=0; a<m; a++){
>   U(a,1)=foo(as<NumericVector>(A.row(a)));
>   }
>   double r = arma::accu(U);
>   return r;
> }
>
> ### how to deal with the arma object A.row(a) for the input of foo, which
> need rcpp object?
>
> A <- matrix(rnorm(8),nrow=4)
> fpp(mean,A)
>

I was able to find this link:
http://stackoverflow.com/questions/14253069/convert-rcpparmadillo-vector-to-rcpp-vector
;
essentially, you're going to have to generate the 'view' first, wrap that
view into a SEXP, and then use 'as' to convert that to a NumericVector. Try:

arma::rowvec tmp = A.row(a);
U(a,1) = foo( as<NumericVector>( wrap(tmp) ) );

(aside -- I think you want to use index 0, rather than 1? Armadillo and
Rcpp matrices/vectors index from 0 rather than 1.)

It may be preferable to just define the function foo in terms of an
arma::vec rather than a NumericVector to avoid the excess 'as'ing and
'wrap'ping though, unless you absolutely need some functionality specific
to Rcpp::NumericVector.)


>
> Thanks.
>
> Best wishes!
>
> Honglang Wang
>
> Office C402 Wells Hall
> Department of Statistics and Probability
> Michigan State University
> 1579 I Spartan Village, East Lansing, MI 48823
> wangho16 at msu.edu
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20130129/4976bd25/attachment.html>


More information about the Rcpp-devel mailing list