r-命名空间中的平行工人



此示例是此前文章的后续示例。我正在尝试将并行工人移至其自己的CPP文件,并在标题文件中声明。

在公共工人中调用'mypackage'功能

两个错误如下:1)变量类型" example internal :: parallel_worker"是一个抽象类

以及在我的不可复制的示例中:2)错误:'example Internals :: Parallel_worker {'parallel_worker.cpp文件中的'line。

现在,代码看起来像这样:

示例internal.h

#ifndef ExampleInternal_H
#define ExampleInternal_H
namespace ExampleInternal{
#include <RcppArmadillo.h>
#include <RcppParallel.h>
double myfunc3(arma::vec vec_in){
  int Len = arma::size(vec_in)[0];
  return (vec_in[0] +vec_in[1])/Len;
}
struct PARALLEL_WORKER : RcppParallel::Worker{};
}

#endif

parallel_worker.cpp

#include <RcppArmadillo.h>
#include <RcppParallel.h>
#include <random>
#include "ExampleInternal.h"
using namespace RcppParallel;
using namespace ExampleInternal;
namespace ExampleInternal{
ExampleInternal::PARALLEL_WORKER{
  const arma::vec &input;
  arma::vec &output;
  PARALLEL_WORKER(const arma::vec &input, arma::vec &output) : input(input), output(output) {}
  void operator()(std::size_t begin, std::size_t end){

    std::mt19937 engine(1);
    // Create a loop that runs through a selected section of the total Boot_reps
    for( int k = begin; k < end; k ++){
      engine.seed(k);
      arma::vec index = input;
      std::shuffle( index.begin(), index.end(), engine);
      output[k] = ExampleInternal::myfunc3(index);
    }
  }
};
} //Close Namespace

parallel_func.cpp

#include <RcppArmadillo.h>
#include <RcppParallel.h>
#include "ExampleInternal.h"
using namespace ExampleInternal;
// [[Rcpp::export]]
arma::vec Parallelfunc(int Len_in){
  arma::vec input = arma::regspace(0, 500);
  arma::vec output(Len_in);
  ExampleInternal::PARALLEL_WORKER parallel_woker(input, output);
  parallelFor( 0, Len_in, parallel_woker);
  return output;
}

您需要正确地在声明和结构的定义之间进行拆分。标题文件中的声明包含成员变量和方法签名。

namespace ExampleInternal{
struct PARALLEL_WORKER : RcppParallel::Worker{
  const arma::vec &input;
  arma::vec &output;
  PARALLEL_WORKER(const arma::vec &input, arma::vec &output);
  void operator()(std::size_t begin, std::size_t end);
};
}

在CPP文件中,您定义方法:

namespace ExampleInternal{
  PARALLEL_WORKER::PARALLEL_WORKER(const arma::vec &input, arma::vec &output) : input(input), output(output) {}
  void PARALLEL_WORKER::operator()(std::size_t begin, std::size_t end){
    std::mt19937 engine(1);
    // Create a loop that runs through a selected section of the total Boot_reps
    for( std::size_t k = begin; k < end; k ++){
      engine.seed(k);
      arma::vec index = input;
      std::shuffle( index.begin(), index.end(), engine);
      output[k] = ExampleInternal::myfunc3(index);
    }
  }

} //Close Namespace

我不得不做更多的更改以使所有内容都没有警告(标题中定义的函数为 inline等),请访问https://github.com/rstub/stackover/stackoverflow/tree/master/master/55082456。请注意,某些更改仅在软件包的RCPP属性的上下文中才有意义。顺便说一句,由于您不提供测试数据,我只验证了编译,而不是正确的操作。

就像跟进一样。要将myFunc3移至单独的.cpp文件,要求我将rcppparallal的标题包括在myfunc3.cpp文件中。我也不必添加"内联"。

myfunc3.cpp

#include <RcppArmadillo.h>
#include <RcppParallel.h>
#include "ExampleInternal.h"
using namespace arma;
namespace ExampleInternal{
double myfunc3(arma::vec vec_in){
  int Len = arma::size(vec_in)[0];
  return (vec_in[0] +vec_in[1])/Len;
}
} // Close namespace

和示例internal.h

#ifndef ExampleInternal_H
#define ExampleInternal_H
namespace ExampleInternal{
#include <RcppArmadillo.h>
#include <RcppParallel.h>
double myfunc3(arma::vec vec_in);
struct PARALLEL_WORKER : RcppParallel::Worker{
  const arma::vec &input;
  arma::vec &output;
  PARALLEL_WORKER( const arma::vec &input, arma::vec &output);
  void operator()(std::size_t begin, std::size_t end);
};
}
#endif

相关内容

  • 没有找到相关文章

最新更新