On Thu, May 2, 2013 at 3:06 PM, Dirk Eddelbuettel <[email protected]> wrote: > > On 2 May 2013 at 14:33, Sameer D'Costa wrote: > | Thanks for the reply Dirk. > | > | On Thu, May 2, 2013 at 12:53 PM, Dirk Eddelbuettel <[email protected]> wrote: > | > > | > Hi Sameer, > | > > | > On 2 May 2013 at 10:16, Sameer D'Costa wrote: > | > | Hi, > | > | > | > | I am trying to return several Armadillo matrices back to R and to set > | > | the names for the rows and the columns of each matrix. I have tried > | > | converting each Armadillo matrix to a NumericMatrix and then setting > | > | the dimnames on that before returning a list to R. This seems to work > | > | (see snippet below) however I am not sure if this is the right way to > | > | go or if I am converting the matrices properly or if extra copies are > | > | being made. Any advice will be appreciated. > | > > | > That looks pretty good. I would simply change to things: > | > > | > -- on entry, create an Armadillo matrix "two-step-way" we have been using > | > here a lot (and which is used eg in fastLm.cpp): create a > NumericMatrix > | > from SEXP (no copies), then instantiate arma::mat() using the begin() > | > iterator, row, cols and FALSE --- and that way you are sure that only > | > pointers to the original memory get copied, and the content itself > should > | > not. > | > -- on exit, do the reverse: do you Armadillo calculations, then access > the > | > memory behind the arma matrix (also guaranteed to be contiguous) to > | > instantiate an Rcpp NumericMatrix. Then set the attributes as you do > | > below and return it. > | > | I understand how to do the entry based on what fastLm.cpp is doing. > | I'm more interested in the exit because in my real work I have the > | matrices generated in c++ itself. I put the entry code just to have a > | self contained inline example to send to the list. However, I'm not > | sure how to do the exit in the way you describe. Would you be able to > | tell me how to use the relevant NumericMatrix constructor or point me > | to an example somewhere? Thanks. > > From a quick look at the header file Matrix.h it seems that > > template <typename Iterator> > Matrix( const int& nrows_, const int& ncols, Iterator start ) ; > > should be what you are after. (The various types are just typedefs to the > templated variants of Matrix for int, double, char, ...) > > But do check the source file to be sure and maybe do a quick performance for > both 'small' and 'large' matrices -- run-time should be constant if there are > only pointer copies.
I tried this constructor and it looks like it does make a copy. (line 119 of Rcpp/inst/include/Rcpp/api/meat/Vector.h if I am reading it correctly). Also looks like the run time does increase significantly as the dimension increases. Oh well. never mind. Thanks. _______________________________________________ Rcpp-devel mailing list [email protected] https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
