我正在尝试移植一个函数,该函数使用 RcppEigen 将稀疏矩阵中的所有非零条目转换为与 RcppParallel 并行运行,但我无法让它工作。
即使用此来源:
#include <RcppEigen.h>
#include <RcppParallel.h>
using namespace Rcpp;
typedef Eigen::SparseMatrix<double> SpMat;
typedef Eigen::Map<SpMat> MSpMat;
// [[Rcpp::export]]
S4 serial_test( S4 m ) {
SpMat src = as<MSpMat>( m );
SpMat tgt = as<MSpMat>( clone( m ) );
for( int i = 0; i < src.rows(); ++i ) {
for( SpMat::InnerIterator srcIt( src, i ), tgtIt( tgt, i ); srcIt; ++srcIt, ++tgtIt ) {
tgtIt.valueRef() = -1;
}
}
S4 out = wrap( tgt );
return out;
}
struct MyWorker : public RcppParallel::Worker {
SpMat src;
SpMat tgt;
MyWorker( const SpMat& src, SpMat& tgt )
: src( src ), tgt( tgt ) {}
void operator()( std::size_t begin, std::size_t end ) {
for( int i = begin; i < end; ++i ) {
for( SpMat::InnerIterator srcIt( src, i ), tgtIt( tgt, i ); srcIt; ++srcIt, ++tgtIt ) {
tgtIt.valueRef() = -1;
}
}
}
};
// [[Rcpp::export]]
S4 para_test( S4 m ) {
SpMat src = as<MSpMat>( m );
SpMat tgt = as<MSpMat>( clone( m ) );
MyWorker wrkr( src, tgt );
RcppParallel::parallelFor( 0, src.outerSize(), wrkr );
S4 out = wrap( tgt );
return out;
}
这个输入:
> m <- Matrix::rsparsematrix( 1000, 1000, 0.1 )
> m[ 1:10, 1:10 ]
10 x 10 sparse Matrix of class "dgCMatrix"
[1,] . . . . 0.52 . . . . .
[2,] . . . . 0.59 . . . . .
[3,] . . . . . . . 0.47 . .
[4,] . . . . . . . 0.25 . .
[5,] . . . . . . . . . .
[6,] . . . . . . . . . .
[7,] . . . . . . . . . .
[8,] . . . . . . . . . .
[9,] . . . . . . . . -1 .
[10,] . . . . . . . . . .
调用 serial_test 有效:
> m1 <- serial_test( m )
> m1[ 1:10, 1:10 ]
10 x 10 sparse Matrix of class "dgCMatrix"
[1,] . . . . -1 . . . . .
[2,] . . . . -1 . . . . .
[3,] . . . . . . . -1 . .
[4,] . . . . . . . -1 . .
[5,] . . . . . . . . . .
[6,] . . . . . . . . . .
[7,] . . . . . . . . . .
[8,] . . . . . . . . . .
[9,] . . . . . . . . -1 .
[10,] . . . . . . . . . .
但是 para_test 什么也没做,即使它运行良好:
> m2 <- para_test( m )
> m2[ 1:10, 1:10 ]
10 x 10 sparse Matrix of class "dgCMatrix"
[1,] . . . . 0.52 . . . . .
[2,] . . . . 0.59 . . . . .
[3,] . . . . . . . 0.47 . .
[4,] . . . . . . . 0.25 . .
[5,] . . . . . . . . . .
[6,] . . . . . . . . . .
[7,] . . . . . . . . . .
[8,] . . . . . . . . . .
[9,] . . . . . . . . -1 .
[10,] . . . . . . . . . .
是否可以将 RcppParallel 与 Eigen 的 SparseMatrix 类一起使用?