在 Rcpp 中使用 colMeans

Jam*_*ran 7 r rcpp

我正在尝试使用 Rcpp 进行一些重要性采样。一个关键的步骤是取重要性权重的平均值(在这个问题中)。我的程序同时对多个自变量进行重要性采样,因此代码使用矩阵而不是向量。下面是一个最小的可重现示例,它是应该发生的事情的理想化版本:

library(Rcpp)

cppFunction('
NumericVector test(){
  NumericMatrix Numerator(100, 10);
  NumericMatrix Denominator(100, 10);

  for(int i = 0; i < 100; i++){
    Numerator(i,_) = log(runif(10));
    Denominator(i,_) = log(runif(10));
  }

  return colMeans(exp(Numerator - Denominator));
}
            ')

test()
Run Code Online (Sandbox Code Playgroud)

我收到这个我不明白的错误:

file17dd7b43bf04.cpp:16:10: error: no matching function for call to 'colMeans'
  return colMeans(exp(Numerator - Denominator));
         ^~~~~~~~
/Library/Frameworks/R.framework/Versions/3.6/Resources/library/Rcpp/include/Rcpp/sugar/functions/rowSums.h:951:1: note: candidate template ignored: could not match 'MatrixBase' against 'Vectorized'
colMeans(const MatrixBase<RTYPE, NA, T>& x, bool na_rm = false) {
^
Run Code Online (Sandbox Code Playgroud)

从表面上看,编译器似乎试图告诉我它不知道函数colMeans是什么,但是 a) 我知道这至少包含在 Rcpp 1.0.3 及更高版本的语法糖中,并且 b) 次要错误似乎暗示我在喂一个不正确的论点。我确定我只是错过了一些简单的东西,但我不确定是什么。

Jam*_*ran 6

按照@DirkEddelbuettel 的建议,以下重新配置似乎使编译器满意:

library(Rcpp)

cppFunction('
  NumericVector test(){
    NumericMatrix Numerator(100, 10);
    NumericMatrix Denominator(100, 10);
    NumericMatrix Ratio(100, 10);

    for(int i = 0; i < 100; i++){
      Numerator(i,_) = log(runif(10));
      Denominator(i,_) = log(runif(10));
      Ratio(i,_) = exp(Numerator(i,_) - Denominator(i, _));
    }

    return colMeans(Ratio);
  }
')

test()
Run Code Online (Sandbox Code Playgroud)

  • 当精心策划的计划得以实现时真是太好了;-) (5认同)