gpt4 book ai didi

c++ - Rcpp - 用二进制函数转换 NumericVector?

转载 作者:行者123 更新时间:2023-11-28 01:34:55 24 4
gpt4 key购买 nike

我正在考虑通过用 C++ 重写并通过 Rcpp 集成来加速一些 R 代码。至少可以说,我的 Cpp 生锈了:所以我很感激任何建议。特别是,我正在寻找有关将函数映射到 Rcpp NumericVector 的所有元素的指针。这是一个例子。

我需要生成一个新的 vector ,如下所示:

  • 获取现有 NumericVectortail 切片;
  • 用除数除以新切片的每个元素

到目前为止我有这个:

// [[Rcpp::export]]
NumericVector cppAdjustProbabilities( NumericVector& currentProbs,
const int index,
const double divisor ) {

//Note index <=0, e.g. -1 means remove first element
if(index == 0) {
return(currentProbs);
} else {
NumericVector newProbs = no_init(currentProbs.size()+index);
NumericVector::iterator i = currentProbs.begin() - index;
NumericVector::iterator j = newProbs.begin();
for(; i != currentProbs.end(); ++i, ++j) {
*j=*i/divisor;
}
return(newProbs);
}
}

这可行,但我更愿意使用“ map ”方法。我查看了 std::transform,但它只支持对 vector 元素的一元运算 - 所以我看不到如何传递除数。例如,这是无效的:

std::transform(currentProbs.begin()-index, currentProbs.end(),
newProbs.begin(), [](double val) { return (val / divisor);} );

有没有办法将 除数 带入 lambda 的范围?或者另一种方法?

谢谢

最佳答案

c++ lambda functions您可以像这样捕获一个值:

src1 <- 'NumericVector cppAdjustProbabilities(  NumericVector& currentProbs, 
const int index,
const double divisor ) {

//Note index <=0, e.g. -1 means remove first element
if(index == 0) {
return(currentProbs);
} else {
NumericVector newProbs = no_init(currentProbs.size()+index);
std::transform(currentProbs.begin()-index, currentProbs.end(),
newProbs.begin(), [&divisor](double val) { return (val / divisor);} );
// ^^^^^^^^
return(newProbs);
}
}'

Rcpp::cppFunction(src1)

currentProbs <- c(0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9)
index <- -5L
divisor <- 2.0
cppAdjustProbabilities(currentProbs, index, divisor)
#> [1] 0.30 0.35 0.40 0.45

关于c++ - Rcpp - 用二进制函数转换 NumericVector?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49723321/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com