[Rcpp-devel] Accessing/copying rows/colums of matrices

Dirk Eddelbuettel edd at debian.org
Thu Apr 7 06:59:48 CEST 2011


On 7 April 2011 at 00:31, Michael Braun wrote:
| A couple of weeks ago, I posted a problem in compiling and running one of the
| examples from the Rcpp-quickref pdf.  There were two suggestions:  one was to
| upgrade my compiler, and the other was to find Linux on "another account
| somewhere at my large-enough university."  I have done both (now using g++ 4.4
| on Red Hat Enterprise Linux), and have the same problem. (The version of Rcpp
| is 0.9.3)
| 
| Consider the following code, executed using the inline package:
| 
| library(Rcpp)
| library(inline)
| 
| body <- '
| 
|    Rcpp::NumericMatrix xx(3,2);
|    int i;
|    int xsize = xx.nrow() * xx.ncol();
|   
|    for (i = 0; i < xsize; i++) {
|      xx[i] = pow(i,2);
|    }
| 
|      Rcpp::NumericMatrix::Column z1 = xx(_,0);
|      Rcpp::NumericVector z2 = xx(_,1);
| 
|    return (Rcpp::wrap(xx));
| '
| 
| func <- cxxfunction(body=body,
|                     plugin="Rcpp",
|                     verbose=TRUE
|                     )
| 
| Dirk ran this on his Debian system, and I can confirm that this works fine on

(Actually Ubuntu, for what it's worth.)

| my Red Hat system.  No problems so far.

Thank you for confirming what I suspected weeks ago: your Mac setup was at
fault, possibly by having too old a compiler.  No issue here with Rcpp.
 
| Now, what if I want to take this code into production, and don't want to use
| the inline package?  The file t2.cpp is:
| 
| #include <Rcpp.h>
| 
|  RcppExport SEXP test() {
|   
| BEGIN_RCPP
| 
|    Rcpp::NumericMatrix xx(3,2);
|    int i;
|    int xsize = xx.nrow() * xx.ncol();
|   
|    for (i = 0; i < xsize; i++) {
|      xx[i] = pow(i,2);
|    }
| 
|      Rcpp::NumericMatrix::Column z1 = xx(_,0);
|      Rcpp::NumericVector z2 = xx(_,1);
| 
|    return (Rcpp::wrap(xx));
| 
| END_RCPP
|   
|  } 
| 
| When I try to compile this, I get
| 
| equity> g++44 -m64 -O0 -fPIC   -Wall -I/usr/local/include -I/usr/include/R -I/
| usr/lib64/R/library/Rcpp/include -c t2.cpp -o t2.o
| 
| t2.cpp: In function ‘SEXPREC* test()’:
| t2.cpp:17: error: ‘_’ was not declared in this scope
| t2.cpp:17: warning: unused variable ‘z1’
| t2.cpp:18: warning: unused variable ‘z2’
| 
| I get this kind of error on both Mac and Linux, using g++ or the Intel
| compiler.  So I hope we can agree that this is not a compiler issue and it is
| not a Mac issue.  There's something about this underscore that is messing
| things up.  (Incidentally, this fails on the Mac when using inline as well, but
| that appears to be yet another issue).

Sorry, but that is your error. The _ is only defined in the Rcpp namespace,
and inline uses a global 'using namespace Rcpp'. 

It so happens that I do not recommend examples or usage with global 'using
namespace ...'  but I have an extremely prolific coauthor who really likes
skipping the Rcpp:: prefix. ;-)  

That is what killed you here.  Either add

   using namespace Rcpp;

at the top of your file (and, as an aside, verbose=TRUE clearly shows you
that in the code built via inline -- we don't hide anything or use magic
obfuscation pixie dust), or equally switch to

   Rcpp::NumericMatrix::Column z1 = xx(Rcpp::_,0);
   Rcpp::NumericVector z2 = xx(Rcpp::_,1);

and your 'production code' will compile:

edd at max:/tmp$ grep _ michael4.cpp
   BEGIN_RCPP
   Rcpp::NumericMatrix::Column z1 = xx(Rcpp::_,0);
   Rcpp::NumericVector z2 = xx(Rcpp::_,1);
   END_RCPP
edd at max:/tmp$ g++-4.5 -I/usr/share/R/include   -I"/usr/local/lib/R/site-library/Rcpp/include"   -fpic  -g -O3 -Wall -pipe -pedantic -Wno-variadic-macros  -c michael4.cpp -o michael4.o
edd at max:/tmp$ ls -l michael4.*
-rw-r--r-- 1 edd edd    365 2011-04-06 23:45 michael4.cpp
-rw-r--r-- 1 edd edd 169584 2011-04-06 23:54 michael4.o
edd at max:/tmp$

| I tried to make this example as small and replicable as possible.  If you need
| me to present this problem another way, please let me know.

No, that was helpful enough -- thank you.

C++ can be messy, and the error messages are not always helpful. We all have
been tripped by things like this.  It is with experience that you start to
get a better feel for this.  You are on the right track -- keep going!

Cheers, Dirk


| Thanks,
| 
| Michael
| 
| 
| 
| 
| 
| 
| 
| -------------------------------------------
| Michael Braun
| Homer A. Burnell (1928) Career Development Professor, 
| and Assistant Professor of Management Science (Marketing Group)
| MIT Sloan School of Management
| 100 Main St.., E62-535
| Cambridge, MA 02139
| braunm at mit.edu
| 617-253-3436
| 
| 
| 
| xapplication/pkcs7-signatu [Click mouse-2 to save to a file]
| 
| ----------------------------------------------------------------------
| _______________________________________________
| 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


More information about the Rcpp-devel mailing list