[Rcpp-devel] Filling NumericMatrix with NumericVectors with apply by row/column?

Romain Francois romain at r-enthusiasts.com
Wed Sep 8 08:40:05 CEST 2010


Le 08/09/10 06:07, Christian Gunning a écrit :
> Yes, I see the reinvent-the-wheel problem, especially after combing
> through rcpp-devel archives some more.  I admit that I don't well
> understand the relative costs/benefits of extending the R proxy class
> versus outsourcing to Armadillo.  Two examples that come to mind are
> Rcpp::Array and Rcpp::DataFrame.
>
> In the first case, could I conceivably turn an input 3D SEXP array
> into, e.g., NumericVector( Dimension(2,3,4) ), create an arma::cube
> out of it, process it and return?

I think so. I have not tried though ... have you ?

> In the second case, there's a column level but no row-level accessor
> for the DataFrame (that I could find), nor is there a mapping into
> Armadillo. I get the impression that DataFrame is more of a
> convenience class for *returning* data rather than processing it?

Yes. It makes it easy to create a data frame and access it by column.

We'd be open to extend the interface if you provide some sort of design 
of the sort of code you'd want to write.

Romain

> best,
> Christian
>
> On Tue, Sep 7, 2010 at 5:48 PM, Dirk Eddelbuettel<edd at debian.org>  wrote:
>>
>> On 7 September 2010 at 17:26, Christian Gunning wrote:
>> | I was thinking about this today, and I wondered if getter/setter
>> | functions for NumericMatrix, along with MatrixIndex classes might make
>> | any sense, as opposed to sugar? Something like this:
>> |
>> | SEXP foo1( int n ){
>> |   NumericVector x(n);
>> |   MatrixIndex i(1);  // row index
>> |   NumericMatrix xx(n,n) ;
>> |   // possible to assign by row or column?
>> |   for (i.index =0; i.index<  n; i.index++) {
>> |     xx.Setter(i) = zeros(n) ;
>> |   }
>> |   return(xx)
>> | }
>> |
>> | class MatrixIndex:
>> | {
>> |   // use apply()'s convention of 1=row, 2=col
>> |   // row/col specification is set on creation
>> |   private:
>> |     int m_rowcol;
>> |   public:
>> |     int index;
>> |     MatrixIndex( int rowcol, int i=0) {
>> |       m_rowcol = rowcol;
>> |       index = i;
>> |     }
>> | };
>>
>> I have to admit that questions like this always leads to _numeric classes_
>> such as Armadillo or NewMat rather than our R proxy classes.  Did you see
>> what Armadillo:  http://arma.sourceforge.net/docs.html#insert_rows
>>
>> Would that help?  Passing matrices from R via Rcpp to Armadillo (and back) is
>> pretty easy.
>>
>> Cheers, Dirk
>>
>> PS We are a little behind wrapping Armadillo 0.9.70 in RcppArmadillo but we
>> will get there "soon".
>>
>>
>> | best,
>> | Christian
>> |
>> | On Sun, Aug 22, 2010 at 5:23 AM, Romain Francois
>> |<romain at r-enthusiasts.com>  wrote:
>> |>  Hello,
>> |>
>> |>  There currently is no sugar facility to generate a matrix the way you want.
>> |>  The last option is probably the best thing to do for now.
>> |>
>> |>  Perhaps outer can help you :
>> |>
>> |>  NumericVector xx(x) ;
>> |>  NumericVector yy(y);
>> |>  NumericMatrix m = outer( xx, yy, std::plus<double>() ) ;
>> |>  return m ;
>> |>
>> |>  Romain
>> |>
>> |>  Le 21/08/10 23:13, Christian Gunning a écrit :
>> |>>
>> |>>  Dear list,
>> |>>
>> |>>  I'm amazed at the ability to use the apply family in Rcpp.  Yet I'm still
>> |>>  unsure of the best way to assign NumericVector objects into
>> |>>  NumericMatrix objects.  Must this be done element-by-element, or is
>> |>>  there something equivalent to R's MyMatrix[,1] = MyColVector?
>> |>>  (As an aside, are both mymatrix[i,j] and mymatrix(i,j) equivalent?  It
>> |>>  seems that I've seen them used interchangably on the list.)
>> |>>
>> |>>  A simple example of what I'm aiming for:
>> |>>  Make an n*n matrix, and use sapply to perform a vector operation by
>> |>>  row, here constructing a vector of length n full of zeros.
>> |>>
>> |>>  // a simple vector-returning function
>> |>>  NumericVector zeros( int n){
>> |>>    NumericVector ret(n);
>> |>>    ret = 0;
>> |>>    return ret;
>> |>>  }
>> |>>
>> |>>  // sapply version, doesn't work but is easy to read
>> |>>  SEXP foo( int n ){
>> |>>    NumericVector x(n);
>> |>>    x = n;
>> |>>    NumericMatrix xx(n,n) ;
>> |>>    // possible to assign by row or column?
>> |>>    xx = sapply( x, zeros ) ;
>> |>>    return(xx);
>> |>>  }
>> |>>
>> |>>  // the looped version, where xx[,i] is not syntactically valid
>> |>>  SEXP foo1( int n ){
>> |>>    NumericVector x(n);
>> |>>    int i;
>> |>>    NumericMatrix xx(n,n) ;
>> |>>    // possible to assign by row or column?
>> |>>    for (i =0; i<n; i++) {
>> |>>      xx[,i] = zeros(n) ;
>> |>>    }
>> |>>    return(xx)
>> |>>  }
>> |>>
>> |>>
>> |>>  // syntactically valid, element-wise assignment
>> |>>  SEXP foo2( int n ){
>> |>>    NumericVector x(n);
>> |>>    int i, j;
>> |>>    NumericMatrix xx(n,n) ;
>> |>>    // possible to assign by row or column?
>> |>>    for (i=0; i<n; i++) {
>> |>>      x = zeros(n) ;
>> |>>      for (j=0;  j<n; j++) {
>> |>>        xx(i,j) = x[j]
>> |>>      }
>> |>>    }
>> |>>    return(xx)
>> |>>  }
>> |>>
>> |>>  thanks so much,
>> |>>  Christian Gunning
>> |>>  --
>> |>>  A man, a plan, a cat, a ham, a yak, a yam, a hat, a canal – Panama!
>> |>
>> |>  --
>> |>  Romain Francois
>> |>  Professional R Enthusiast
>> |>  +33(0) 6 28 91 30 30
>> |>  http://romainfrancois.blog.free.fr
>> |>  |- http://bit.ly/bzoWrs : Rcpp svn revision 2000
>> |>  |- http://bit.ly/b8VNE2 : Rcpp at LondonR, oct 5th
>> |>  `- http://bit.ly/aAyra4 : highlight 0.2-2
>> |>
>> |>
>> |
>> |
>> |
>> | --
>> | A man, a plan, a cat, a ham, a yak, a yam, a hat, a canal – Panama!
>> | _______________________________________________
>> | Rcpp-devel mailing list
>> | Rcpp-devel at lists.r-forge.r-project.org
>> | https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
>>
>> --
>> Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com
>>
>
>
>


-- 
Romain Francois
Professional R Enthusiast
+33(0) 6 28 91 30 30
http://romainfrancois.blog.free.fr
|- http://bit.ly/bzoWrs : Rcpp svn revision 2000
|- http://bit.ly/b8VNE2 : Rcpp at LondonR, oct 5th
`- http://bit.ly/aAyra4 : highlight 0.2-2




More information about the Rcpp-devel mailing list