Rcpp-用二元函数变换数值向量? 我在用C++重新编写和通过RCPP进行集成来加快一些R代码的速度。至少可以说,我的Cpp已经生锈了:因此,如果有任何建议,我将不胜感激。特别是,我正在寻找将函数映射到RcppNumericVector的所有元素上的指针。这里有一个例子

Rcpp-用二元函数变换数值向量? 我在用C++重新编写和通过RCPP进行集成来加快一些R代码的速度。至少可以说,我的Cpp已经生锈了:因此,如果有任何建议,我将不胜感激。特别是,我正在寻找将函数映射到RcppNumericVector的所有元素上的指针。这里有一个例子,c++,rcpp,C++,Rcpp,我需要生成一个新的向量,如下所示: 获取现有数值向量的尾部切片 用除数除以新切片的每个元素 到目前为止,我有: // [[Rcpp::export]] NumericVector cppAdjustProbabilities( NumericVector& currentProbs, const int index, cons

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

  • 获取现有
    数值向量的
    尾部
    切片
    
  • 用除数除以新切片的每个元素
到目前为止,我有:

// [[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);
  }
}
有没有办法将
除数
引入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
src1使用可以捕获如下值:

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

src1以便我理解,您想将切片的每个元素除以一个值吗?例如,如果
currentProbs
为(0.1,0.2,0.3),索引为-1,除数为2,那么输出是否为(0.1,0.15)--取除第一个(0.2,0.3)之外的每个元素,除以2得到(0.1,0.15)?我问这个问题是因为我非常怀疑除以向量的子集是一个上下文,你会得到很多(如果有的话)速度增益vs。R@duckmayr,是的,没错,谢谢。这只是一个更大的计算的一部分,因此需要进行调查。另外,我们还研究了在另一个BLAS库中进行链接是否会改善情况。我明白了,您想将切片的每个元素除以一个值吗?例如,如果
currentProbs
为(0.1,0.2,0.3),索引为-1,除数为2,那么输出是否为(0.1,0.15)--取除第一个(0.2,0.3)之外的每个元素,除以2得到(0.1,0.15)?我问这个问题是因为我非常怀疑除以向量的子集是一个上下文,你会得到很多(如果有的话)速度增益vs。R@duckmayr,是的,没错,谢谢。这只是一个更大的计算的一部分,因此需要进行调查。另外,还将研究在替代BLAS库中链接是否会改善情况。谢谢@Ralf Stubner,太好了。谢谢@Ralf Stubner,太好了。