[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