RcppParallel共享向量

时间:2015-06-26 15:26:28

标签: rcpp

在下面的示例代码中,使用一个长向量(A),一个标量(dim),一个矩阵(toadd)和两个向量(rows,cols)来初始化Worker对象。代码将长向量缩减为方形矩阵,但每次乘以由toadd,rows和cols定义的相应条目。

代码没有产生正确的答案。

Sheet1

请尝试// [[Rcpp::depends(RcppParallel)]] // [[Rcpp::depends(RcppArmadillo)]] #include <RcppArmadillo.h> #include <RcppParallel.h> #include <iostream> using namespace Rcpp; using namespace RcppParallel; struct Lapin : public Worker { // input pars const RMatrix<double> toadd; const RVector<double> input; const size_t dim; const RVector<int> rows; const RVector<int> cols; // outputs a matrix RMatrix<double> output; // two constructors Lapin(const NumericMatrix toadd,const NumericVector input,const int dim, const IntegerVector rows, const IntegerVector cols, NumericMatrix output) : toadd(toadd),input(input), dim(dim),rows(rows), cols(cols), output(output) { } Lapin(const Lapin & jeannot, Split) : toadd(jeannot.toadd),input(jeannot.input),dim(jeannot.dim), rows(jeannot.rows), cols(jeannot.cols),output(jeannot.output) { } // the working operator void operator()(size_t begin, size_t end) { for(size_t k = begin; k < end; k++) { //Rprintf("k=%d \t",k); for(size_t i = 0; i < dim; i++) { for(size_t j = 0; j < dim; j++) { //output(i,j) += input(k)+i+j; size_t idx_i = rows[i]; size_t idx_j = cols[j]; output(i,j) += input[k] + toadd(idx_i,idx_j); } } } } // the join void join(const Lapin & peter) { for(size_t i = 0; i < dim; i++) { for(size_t j = 0; j < dim; j++) { output(i,j) += peter.output(i,j); } } } }; // [[Rcpp::export]] NumericMatrix f(NumericVector A, size_t dim) { // initialize the toadd matrix; NumericMatrix toadd(10*dim,10*dim); for(size_t i = 0; i < 10*dim; i++) { for(size_t j = 0; j < 10*dim; j++) { toadd(i,j) = i+j; } } // initialize the rows and columns indices; IntegerVector rows(dim); for(size_t ir=0; ir<dim; ir++){ rows(ir) = 1*ir; } IntegerVector cols(dim); for(size_t ic=0; ic<dim; ic++){ cols(ic) = 1*ic; } // initialize output NumericMatrix output(dim,dim); Lapin groumf(toadd,A,dim,rows,cols,output); parallelReduce(0, A.size(), groumf); return output; } 查看错误。

这个例子的动机是我需要在线程之间共享对象,在本例中为f(rep(1,100),5)在RcppParallel中。

0 个答案:

没有答案