[Rcpp-devel] Filling a big.matrix in Rcpp

Dirk Eddelbuettel edd at debian.org
Fri Mar 15 01:57:56 CET 2013

On 15 March 2013 at 00:51, Romain Francois wrote:
| Why do you use wrap here ?

Reflex, because I returned an atomistic type.

| Wrap will create a SEXP, not a bool !

Quite right but was in a rush while doing other things too. "Forgot" that I
was using sourceCpp() which give one additional layer of indirection.
| Actually why is this not void ?

Quite right.  Better version below. Thanks!  

Ultimately, we do of course want a version that takes an XPtr to a big.matrix
and does something sensible and returns it.


// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; indent-tabs-mode: nil; -*-

#include <Rcpp.h>

// The next line is all it takes to find the bigmemory 
// headers -- thanks to the magic of Rcpp attributes

// [[Rcpp::depends(bigmemory)]]
#include <bigmemory/MatrixAccessor.hpp>

// We define a simple function, and pass the incoming XPtr as a SEXP;
// we could also pass a templated XPtr. Function returns only a bool.

// [[Rcpp::export]]
void fun(SEXP A) {
    Rcpp::XPtr<BigMatrix> bigMat(A);
    MatrixAccessor<int> Am(*bigMat);
    int nrows = bigMat->nrow();
    int ncolumns = bigMat->ncol();
    for (int j = 0; j < ncolumns; j++){
	for (int i = 1; i < nrows; i++){
            Am[j][i] = Am[j][i] + Am[j][i-1];

// R code for testing below

/*** R

# set up big.matrix
nrows <- 10000
bkFile <- "bigmat.bk"
descFile <- "bigmatk.desc"
bigmat <- filebacked.big.matrix(nrow=nrows, ncol=3,type="integer", init=1,
				backingfile=bkFile, backingpath=".",descriptorfile=descFile,
matDesc <- bigmemory::describe(bigmat)

fun(bigmat at address)


Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com  

More information about the Rcpp-devel mailing list