在下面的示例代码中,使用一个长向量(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中。