我通常使用一个简短的Rcpp函数,该函数将一个矩阵作为输入,其中每行包含总和为1的K个概率。然后,该函数为每行随机采样1到K之间与提供的概率相对应的整数。这是功能:
// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadilloExtensions/sample.h>
using namespace Rcpp;
// [[Rcpp::export]]
IntegerVector sample_matrix(NumericMatrix x, IntegerVector choice_set) {
int n = x.nrow();
IntegerVector result(n);
for ( int i = 0; i < n; ++i ) {
result[i] = RcppArmadillo::sample(choice_set, 1, false, x(i, _))[0];
}
return result;
}
我最近更新了R和所有软件包。现在,我无法再编译此函数。我不清楚原因。正在运行
library(Rcpp)
library(RcppArmadillo)
Rcpp::sourceCpp("sample_matrix.cpp")
引发以下错误:
error: call of overloaded 'sample(Rcpp::IntegerVector&, int, bool, Rcpp::Matrix<14>::Row)' is ambiguous
这基本上告诉我,我对RcppArmadillo::sample()
的呼叫不明确。有人能启发我为什么会这样吗?
答案 0 :(得分:8)
这里发生了两件事,而问题和答案则分为两部分。
第一个是“元”:为什么现在?好吧,我们在sample()
代码/设置中遇到了一个错误,该克里斯蒂安(Christian)友好地修复了最新的RcppArmadillo版本(所有内容均记录在此)。简而言之,在这里给您带来麻烦的可能性极高的参数的界面已更改,因为重新使用/重复使用并不安全。现在是了。
第二,错误消息。您没有说要使用什么编译器或版本,但是我的(当前为g++-9.3
)实际上对于解决该错误很有帮助。它仍然是C ++,因此需要一些解释性的舞蹈,但从本质上讲,它清楚地说明了您使用Rcpp::Matrix<14>::Row
进行了调用,并且没有为该类型提供接口。哪个是对的。 sample()
提供了一些接口,但没有提供Row
对象的接口。因此,修复很简单。通过将行设置为NumericVector
,添加一行以帮助编译器,一切都很好。
#include <RcppArmadillo.h>
#include <RcppArmadilloExtensions/sample.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
// [[Rcpp::export]]
IntegerVector sample_matrix(NumericMatrix x, IntegerVector choice_set) {
int n = x.nrow();
IntegerVector result(n);
for ( int i = 0; i < n; ++i ) {
Rcpp::NumericVector z(x(i, _));
result[i] = RcppArmadillo::sample(choice_set, 1, false, z)[0];
}
return result;
}
R> Rcpp::sourceCpp("answer.cpp") # no need for library(Rcpp)
R>