Rcpp 中 pow 的矢量化指数
vectorized exponent for pow in Rcpp
Rcpp 允许向量化一些操作,这很棒。但是对于 pow
只有基数可以是向量,不能是指数。通常,在编译时:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector puissancedCpp(NumericVector base, double exp){
return pow(base,exp);
}
有效但无效:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector puissancedCpp(NumericVector base, NumericVector exp){
return pow(base,exp);
}
在 R 中执行的推荐方法是:
c(0,1,2,3)^c(4,3,2,1)
在用 C 语言完成其他事情的过程中?
这是一个选项,假设您的编译器支持 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
*/
如果您使用的是较旧的编译器,您可以使用
实现此目的
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;
}
如果您出于某种原因不能使用 C++11,则有一个替代方案
#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))
***/
产生
R> Rcpp::sourceCpp("vecpow.cpp")
R> vecpow(c(0:3), c(4:1))
[1] 0 1 4 3
R>
Rcpp 允许向量化一些操作,这很棒。但是对于 pow
只有基数可以是向量,不能是指数。通常,在编译时:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector puissancedCpp(NumericVector base, double exp){
return pow(base,exp);
}
有效但无效:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector puissancedCpp(NumericVector base, NumericVector exp){
return pow(base,exp);
}
在 R 中执行的推荐方法是:
c(0,1,2,3)^c(4,3,2,1)
在用 C 语言完成其他事情的过程中?
这是一个选项,假设您的编译器支持 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
*/
如果您使用的是较旧的编译器,您可以使用
实现此目的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;
}
如果您出于某种原因不能使用 C++11,则有一个替代方案
#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))
***/
产生
R> Rcpp::sourceCpp("vecpow.cpp")
R> vecpow(c(0:3), c(4:1))
[1] 0 1 4 3
R>