Skip to content
Back to formatted view

Raw Message

Message-ID: <7E8037094A0C2146AA3E6F94DAE621C307DE429F@AD-EXCHMBX2-1.aau.dk>
Date: 2012-09-10T13:55:23Z
From: Søren Højsgaard
Subject: [Rcpp-devel] Getting and setting array dimensions - simpler ways?

Dear list,

I want to do some operations on an array, here exemplified by taking log (the operations I have in mind are made using RcppArmadillo):

> pp  <- array(c(.1, .4, .4, .1), dim=c(2,2),dimnames=list(A=c("a1","a2"), B=c("b1","b2")))
> log(pp)
    B
A            b1         b2
  a1 -2.3025851 -0.9162907
  a2 -0.9162907 -2.3025851

It is essential that dim and dimnames attributes are preserved. My take on this task is:

src <-'
 using namespace arma;
 using namespace Rcpp;
 NumericVector p(pp_);
 // Some computations using RcppArmadillo
 vec pp = as<vec>(pp_);
 vec aa = log(pp);
 // Get the result back
 NumericVector ans(p.length());
 ans = aa;
 // Set attributes
 ans.attr("dim")      = p.attr("dim");
 ans.attr("dimnames") = p.attr("dimnames");
 return(wrap(ans));   
 '  
> library(inline)
> loga <- cxxfunction(signature(pp_ = ""), src, plugin = "RcppArmadillo", verbose=F)
> loga(pp)
    B
A            b1         b2
  a1 -2.3025851 -0.9162907
  a2 -0.9162907 -2.3025851

This works, but if anyone can spot a more elegant (fewer lines) way of doing it, I would be happy to know...

Best regards
S?ren