[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