[Rcpp-devel] How many copies of my object do I make?

Søren Højsgaard sorenh at math.aau.dk
Mon Dec 9 23:14:20 CET 2013

Dear all,
Using RcppEigen I've created a function for converting a sparse matrix (a dgCMatrix) to a standard dense matrix:

typedef Eigen::SparseMatrix<double> SpMatd;
typedef Eigen::MappedSparseMatrix<double> MSpMat;

// [[Rcpp::export]]
SEXP do_dgCMatrix2matrix ( SEXP XX_ ){
  S4 DD(wrap(XX_));
  List dn = clone(List(DD.slot("Dimnames")));
  SpMatd X(as<SpMatd>(XX_));
  Eigen::MatrixXd dMat;
  dMat = Eigen::MatrixXd( X );
  NumericMatrix Xout(wrap(dMat));
  Xout.attr("dimnames") = dn;
  return Xout;

The function does what I expect it to, but I am curious about how many times I really create some sort of "copy" of my input matrix and when all I do is put a small layer of "vernish" over my input matrix?

1) dMat is dense matrix, and that must (I guess) refer to new "object"??

2) X is a sparse matrix, and I suppose it is a new object?? 

2') If I had declared it to be MSpMat, then it would really just be the input object with a few bells and whistles??

3) But how about DD and Xout? Are they new objects (in terms of memory usage)?

Put differently, if my input matrix occupies B bytes of memory, how many times B have I then created along the way?

All the best

More information about the Rcpp-devel mailing list