[Rcpp-devel] speed

Richard Chandler richard.chandlers at gmail.com
Wed Aug 4 21:21:17 CEST 2010


Hi,

I wrote my first Rcpp/C++ program in hopes of speeding up an R
function, but alas it is slower. I think the C++ program is slower
because I have made heavy use of dbinom and dpois from R. Is there a
way to do this without calling back to R? Are there any other obvious
ways to speed up the C++ program? I realize that I can vectorize the R
function and avoid zero probabilities, but I have showed it this way
for simplicity.

Thanks,
Richard



fx <- cxxfunction(signature(Kr="integer"), '
    Environment stats("package:stats");
    Function dbinom = stats["dbinom"];
    Function dpois = stats["dpois"];

    IntegerVector K(Kr);
    NumericMatrix bpsum(K.size(), K.size());
    for(int i=0; i<K.size(); i++) {
        for(int j=0; j<K.size(); j++) {
            IntegerVector Ki = K[i];
            IntegerVector cmin = seq_len(Ki.size()+1);
            IntegerVector cmin0 = cmin-1;
            NumericVector bin = dbinom(cmin0, K[j], 0.5);
            NumericVector pois = dpois(K[j]-cmin0, 1.5);
            NumericVector bp = bin * pois;
            bpsum(i, j) = std::accumulate(bp.begin(), bp.end(), 0.0);
            }
        }
    return bpsum;
    ',  plugin="Rcpp")



fxR <- function(K) {
    lk <- length(K)
    bpsum <- matrix(NA, lk, lk)
    for(i in 1:lk)
        for(j in 1:lk)
            bpsum[i, j] <- sum(dbinom(0:K[i], K[j], 0.5) *
dpois(K[j]-(0:K[i]), 1.5))
    return(bpsum)
    }


all.equal(fx(0:10), fxR(0:10))
system.time(fx(0:100))
system.time(fxR(0:100))


More information about the Rcpp-devel mailing list