我正在尝试使用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()
我收到我不明白的错误:
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) {
^
表面上看起来,编译器试图告诉我它不知道函数colMeans
是什么,但是a)我知道至少Rcpp 1.0.3和更高版本的语法糖中包含了它,并且b )次要错误似乎表明我输入的参数不正确。我确定我只是缺少一些简单的东西,但是我不确定是什么。
按照@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()