以下是关于
然而,如果我用
非常感谢您提前给出的任何澄清。
parallelFor
的玩具示例,f2
是f1
的并行化版本,已经成功运行:// [[Rcpp::depends(RcppParallel)]]
// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
#include <RcppParallel.h>
#include <iostream>
#define vector NumericVector
using namespace Rcpp;
using namespace RcppParallel;
// compute values i/i+1 for i = 0 to n-1
// [[Rcpp::export]]
vector f1(int n) {
vector x(n);
for(int i = 0; i < n; i++) x[i] = (double) i/ (i+1);
return x;
}
struct mytry : public Worker {
vector output;
mytry(vector out) : output(out) {}
void operator()(std::size_t begin, std::size_t end) {
for(int i = begin; i < end; i++) output[i] = (double) i/ (i+1);
}
};
// [[Rcpp::export]]
vector f2(int n) {
vector x(n);
mytry A(x);
parallelFor(0, n, A);
return x;
}
然而,如果我用
#define vector arma::vec
替换 #define vector NumericVector
,则这种方法不再有效。代码可以编译和运行,f1
没问题,但是由 f2
返回的向量仅包含未初始化的值。非常感谢您提前给出的任何澄清。
arma::vec
应该成为类的引用成员吗?(对于Rcpp
的情况来说,这是可行的,因为 R 的向量只是指针上的代理对象,所以您仍然可以访问相同的对象) - Kevin Ushey&
就可以运行:具体来说,将vector output;
替换为vector & output;
,并将mytry(vector out) : output(out) {}
替换为mytry(vector & out) : output(out) {}
。您能否将您的评论作为答案表述?我很乐意接受它。因为我不太可能是唯一遇到这个问题的新手,所以我认为这很值得。 - Elvis