[Rcpp-devel] Returning Armadillo matrices with dimnames

Sameer D'Costa sameerdcosta at gmail.com
Thu May 2 23:37:27 CEST 2013


On Thu, May 2, 2013 at 3:06 PM, Dirk Eddelbuettel <edd at debian.org> 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 <edd at debian.org> 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.


More information about the Rcpp-devel mailing list