RcppArmadillo 0.1.0

March 11, 2010

(This article was first published on dirk.eddelbuettel, and kindly contributed to R-bloggers)

Besides the new RcppExamples,
another new package RcppArmadillo got spun out of
Rcpp with the recent release 0.7.8 of Rcpp.

Romain and I already had
an example of a simple but fast linear model fit using the (very clever)
Armadillo C++ library by Conrad Sanderson.
In fact, I had used this as a motivational example of why
Rcpp rocks in a
recent talk to the ACM chapter at U of Chicago which, thanks to David Smith at REvo,
got some further exposure.

Now this example is more refined as further glue got added. Given
that both Armadillo and Rcpp make use of
C++ templates, the actual amount of code in RcppArmadillo is not that large:
just over 200 lines in a header file, and a little less for some testing accessor
and example functions in a source file. And this makes for some really nice
example code: the ‘fast regression’ example becomes this (where I simply
removed two blocks with conditional on the Armadillo version):

#include <RcppArmadillo.h> extern "C" SEXP fastLm(SEXP ys, SEXP Xs) { Rcpp::NumericVector yr(ys); // creates Rcpp vector from SEXP Rcpp::NumericMatrix Xr(Xs); // creates Rcpp matrix from SEXP int n = Xr.nrow(), k = Xr.ncol(); arma::mat X(Xr.begin(), n, k, false); // reuses memory and avoids extra copy arma::colvec y(yr.begin(), yr.size(), false); arma::colvec coef = solve(X, y); // fit model y ~ X arma::colvec resid = y - X*coef; // residuals double sig2 = arma::as_scalar( trans(resid)*resid/(n-k) ); // std.error of estimate arma::colvec stderrest = sqrt( sig2 * diagvec( arma::inv(arma::trans(X)*X)) ); Rcpp::Pairlist res(Rcpp::Named( "coefficients", coef), Rcpp::Named( "stderr", stderrest)); return res;

No extra copies! Armadillo instantiates directly from the underlying R
objects for the vector and matrix, solves the regression equations, computes
the standard error of the estimates and returns the two vectors. Leaving us
to write about eleven lines of code. Moreover, as Armadillo is well designed
and uses template meta-programming to avoid extra copies (see these lecture
notes for details
), it is about as efficient as it can be (and will use
Atlas or other BLAS where available).

And, this is just one example. Rcpp should be
suitable for other C++ libraries, and provides an easy to use seamless
interface between C++ and R.

However, we should note that (at about the last minute) we found out about some unit test failures in OS
X as well as some issues in a Debian chroot —
cran2deb ran into some build
issues on i386 and amd64 in the testing chroot even this ‘it all works’
swimmingly on our Debian, Ubuntu and Fedora build environments. A follow-up
with fixes for either Rcpp and/or RcppArmadillo appears likely.

Update: The build issues seems to be with 64-bit systems and everything appears cool in 32-bit.

To leave a comment for the author, please follow the link and comment on their blog: dirk.eddelbuettel.

R-bloggers.com offers daily e-mail updates about R news and tutorials on topics such as: Data science, Big Data, R jobs, visualization (ggplot2, Boxplots, maps, animation), programming (RStudio, Sweave, LaTeX, SQL, Eclipse, git, hadoop, Web Scraping) statistics (regression, PCA, time series, trading) and more...

If you got this far, why not subscribe for updates from the site? Choose your flavor: e-mail, twitter, RSS, or facebook...

Comments are closed.


Mango solutions

RStudio homepage

Zero Inflated Models and Generalized Linear Mixed Models with R

Dommino data lab

Quantide: statistical consulting and training




CRC R books series

Six Sigma Online Training

Contact us if you wish to help support R-bloggers, and place your banner here.

Never miss an update!
Subscribe to R-bloggers to receive
e-mails with the latest R posts.
(You will not see this message again.)

Click here to close (This popup will not appear again)