# Vectorized exponent for pow in Rcpp

Rcpp allows some operations to be vectorized, which is great. But for pow

only the base number can be a vector, not an indicator. Typically, when compiling:

#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector puissancedCpp(NumericVector base, double exp){
return pow(base,exp);
}

works, but not:

#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector puissancedCpp(NumericVector base, NumericVector exp){
return pow(base,exp);
}

What would be the recommended way to accomplish what in R:

c(0,1,2,3)^c(4,3,2,1)

in the middle of other things done in C?

+3

source to share

Here's one option, assuming your compiler supports C ++ 11:

#include <Rcpp.h>
// [[Rcpp::plugins(cpp11)]]

// [[Rcpp::export]]
std::vector<double> vpow(const std::vector<double>& base, const std::vector<double>& exp) {
std::vector<double> res(base.size());
std::transform(base.begin(), base.end(), exp.begin(), res.begin(),
[&](double lhs, double rhs) -> double {
return std::pow(lhs, rhs);
});
return res;
}

/*** R

c(0,1,2,3)^c(4,3,2,1)
#[1] 0 1 4 3
vpow(0:3, c(4,3,2,1))
#[1] 0 1 4 3

*/

If you are working with an old compiler, you can achieve this using

double dpow(const double lhs, const double rhs) {
return std::pow(lhs, rhs);
}

// [[Rcpp::export]]
std::vector<double> vpow98(const std::vector<double>& base, const std::vector<double>& exp) {
std::vector<double> res(base.size());
std::transform(base.begin(), base.end(), exp.begin(), res.begin(), dpow);
return res;
}

+4

source

Alternative if you can't use C ++ 11 for some reason

#include <Rcpp.h>

using namespace Rcpp;

// [[Rcpp::export]]
NumericVector vecpow(const NumericVector base, const NumericVector exp) {
NumericVector out(base.size());
std::transform(base.begin(), base.end(),
exp.begin(), out.begin(), ::pow);
return out;
}

/*** R
vecpow(c(0:3), c(4:1))
***/

which produces

R> Rcpp::sourceCpp("vecpow.cpp")

R> vecpow(c(0:3), c(4:1))
[1] 0 1 4 3
R>

+10

source

All Articles