繁体   English   中英

RCPP-用二进制函数转换NumericVector吗?

[英]Rcpp - transform NumericVector with binary function?

我正在考虑通过用C ++重写和通过Rcpp集成来加快一些R代码的速度。 至少可以说,我的Cpp很生疏:所以请多加建议。 特别是,我正在寻找有关将函数映射到Rcpp NumericVector所有元素的NumericVector 这是一个例子。

我需要产生一个新的向量,如下所示:

  • 取一个现有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);
  }
}

这可行,但是我更喜欢使用“地图”方法。 我看了std::transform ,但是它仅支持对向量元素进行一元运算-因此我看不到如何将除数传入。例如,这是无效的:

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

是否有办法将divisor纳入lambda? 还是另一种方式呢?

谢谢

使用c ++ lambda函数,您可以捕获如下值:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM