Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 访问RcppParallel中的开始和结束(exmaple计算向量的平均值)_C++_R_Rcpp_Rcppparallel - Fatal编程技术网

C++ 访问RcppParallel中的开始和结束(exmaple计算向量的平均值)

C++ 访问RcppParallel中的开始和结束(exmaple计算向量的平均值),c++,r,rcpp,rcppparallel,C++,R,Rcpp,Rcppparallel,我在学习RcppParallel时遇到了一个问题。 我试图修改向量求和的代码形式,以计算向量的平均值,看看我是否理解一般原理 我的代码如下所示。在c(1,2,3,4,5)上使用函数parallelVectorMean()会产生不一致且通常不正确的结果。我假设这与我不理解如何正确地访问开始和结束以在连接期间相应地缩放我的部分方法有关 // [[Rcpp::depends(RcppParallel)]] #include <RcppParallel.h> #include <Rcp

我在学习RcppParallel时遇到了一个问题。 我试图修改向量求和的代码形式,以计算向量的平均值,看看我是否理解一般原理

我的代码如下所示。在c(1,2,3,4,5)上使用函数parallelVectorMean()会产生不一致且通常不正确的结果。我假设这与我不理解如何正确地访问开始和结束以在连接期间相应地缩放我的部分方法有关

// [[Rcpp::depends(RcppParallel)]]
#include <RcppParallel.h>
#include <Rcpp.h>
using namespace RcppParallel;

struct Mean : public Worker
{
   // source vector
   const RVector<double> input;
   
   // accumulated value
   double value;
   
   // number of elements
   double num;
   
   // constructors
   Mean(const Rcpp::NumericVector input) : input(input), value(0), num(0) {}
   Mean(const Mean& mean, Split) : input(mean.input), value(0), num(0) {}
   
   // accumulate just the element of the range I've been asked to
   void operator()(std::size_t begin, std::size_t end) {
      num = (double) end - (double) begin;
      value += (std::accumulate(input.begin() + begin, input.begin() + end, 0.0) / num);
   }
   
   // join my value with that of another Mean
   void join(const Mean& rhs) {
      value = (num*value + rhs.num*rhs.value)/(num + rhs.num);
      num = num + rhs.num;
   }
};

// [[Rcpp::export]]
double parallelVectorMean(Rcpp::NumericVector x) {
   
   // declare the MeanBody instance
   Mean mean(x);
   
   // call parallel_reduce to start the work
   RcppParallel::parallelReduce(0, x.length(), mean);
   
   // return the computed mean
   return mean.value;
}
/[[Rcpp::depends(RcppParallel)]]
#包括
#包括
使用名称空间RcppParallel;
结构平均值:公共工作者
{
//源向量
常量输入;
//累积价值
双重价值;
//元素数
双数;
//建设者
均值(const Rcpp::NumericVector输入):输入(input),值(0),num(0){
均值(const-Mean&Mean,Split):输入(Mean.input),值(0),num(0){
//只积累我被要求的范围内的元素
void运算符()(std::size\u t begin,std::size\u t end){
num=(双)结束-(双)开始;
值+=(标准::累加(input.begin()+开始,input.begin()+结束,0.0)/num);
}
//将我的价值与另一个平均值结合起来
无效连接(常数平均值和rhs){
value=(num*value+rhs.num*rhs.value)/(num+rhs.num);
num=num+rhs.num;
}
};
//[[Rcpp::导出]]
双并行向量平均(Rcpp::NumericVector x){
//声明MeanBody实例
平均值(x);
//调用parallel_reduce开始工作
RcppParallel::parallelReduce(0,x.length(),平均值);
//返回计算的平均值
返回均值;
}

我期待着向你们学习。

访问“开始”和“结束”很好,但运算符函数的逻辑不正确

选中此项:

   void operator()(std::size_t begin, std::size_t end) {
      double temp_num = (double) end - (double) begin;
      double temp_value = (std::accumulate(input.begin() + begin, input.begin() + end, 0.0) / temp_num);
      value = (num*value + temp_num*temp_value)/(num + temp_num);
      num = num + temp_num;
   }
一个线程可能会继续在一个新的范围内运行而不加入,因此您必须考虑这种可能性