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

Christian Gunning xian at unm.edu
Wed Sep 8 06:07:16 CEST 2010


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?

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?

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
>



-- 
A man, a plan, a cat, a ham, a yak, a yam, a hat, a canal – Panama!


More information about the Rcpp-devel mailing list