[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