RcppArmadillo 的 sample() 在更新 R 后不明确
RcppArmadillo's sample() is ambiguous after updating R
我通常使用一个短的 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()
的调用不明确。谁能告诉我为什么会这样?
这里发生了两件事,你的问题有两部分,因此有答案。
第一个是"meta":为什么现在?好吧,我们在 sample()
代码/设置中有一个错误,Christian 为最新的 RcppArmadillo 版本修复了这个错误(所有记录都在那里)。简而言之,此处给您带来麻烦的极概率论证的界面已更改 ,因为重新使用/重复使用不安全 。就是现在了。
二、错误信息。你没有说你使用的是什么编译器或版本,但我的(目前 g++-9.3
)实际上对错误很有帮助。它仍然是 C++,因此需要一些解释性舞蹈,但本质上它清楚地说明您使用 Rcpp::Matrix<14>::Row
调用并且没有为该类型提供接口。哪个是正确的。 sample()
提供了一些接口,但 none 用于 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>
我通常使用一个短的 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()
的调用不明确。谁能告诉我为什么会这样?
这里发生了两件事,你的问题有两部分,因此有答案。
第一个是"meta":为什么现在?好吧,我们在 sample()
代码/设置中有一个错误,Christian 为最新的 RcppArmadillo 版本修复了这个错误(所有记录都在那里)。简而言之,此处给您带来麻烦的极概率论证的界面已更改 ,因为重新使用/重复使用不安全 。就是现在了。
二、错误信息。你没有说你使用的是什么编译器或版本,但我的(目前 g++-9.3
)实际上对错误很有帮助。它仍然是 C++,因此需要一些解释性舞蹈,但本质上它清楚地说明您使用 Rcpp::Matrix<14>::Row
调用并且没有为该类型提供接口。哪个是正确的。 sample()
提供了一些接口,但 none 用于 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>