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

Christian Gunning xian at unm.edu
Wed Sep 8 02:26:04 CEST 2010


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

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!


More information about the Rcpp-devel mailing list