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

Christian Gunning xian at unm.edu
Wed Sep 8 11:24:43 CEST 2010


On Tue, Sep 7, 2010 at 11:40 PM, Romain Francois
<romain at r-enthusiasts.com> wrote:
> 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 ?

No, not yet.  I just now went mucking about through the armadillo
classes (and, by extension, the rcpp-devel archives) at Dirk's
suggestion.

>> 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.

Yeah, I apologize - I'm just at the edge of my experience here.  I
spent the last few days learning proper C++ OOP writing (as opposed to
reading) in response to your earlier comment about references.  I
admit, templates are still magic to me.

I guess I'm still curious about the fundamental design goals.
RcppArmadillo allows us to easily use armadillo's rich object model,
with a wealth of object-specific methods, e.g.:

mat A = randu<mat>(5,10);
mat B = ones<mat>(5,2);
// at column 2, insert a copy of B;
A.insert_cols(2, B);

Personally, R's indexing is one of my favorite parts of the language
(and C++ indexing my least). With this in mind, I've wondered about
the possibility of rolling some sort of generic Index class that
contains enough information to do (as above):

A(aColIndex) = B;

So, if the overall goal is Simple/Reads-more-like-C++, then it's a
moot point.  If something like this is worth doing, is it worth doing
for a variety of Rcpp classes?  I admit that i'm not entirely clear on
the cost side of the "worth" equation here :)

Christian

> 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
>
>
>



-- 
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