Я пробую Rcpp / RcppArmadillo в RStudio со следующим кодом:
#include <RcppArmadillo.h>
//[[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
using std::exp;
using std::log1p;
// [[Rcpp::export]]
arma::vec log1pexp(arma::vec x) {
for(int ii = 0; ii < x.n_elem; ++ii){
if(x(ii) < 18.0){
x(ii) = log1p(exp(x(ii)));
} else{
x(ii) = x(ii) + exp(-x(ii));
}
}
return x;
}
RStudio говорит, что звонки exp
неоднозначны. Я пробовал звонить std::exp
в коде вместо using std::exp
но не имеют успеха. Код компилируется без предупреждений через Rcpp::sourceCpp('filename.cpp')
, Если я брошу (float)x(ii)
в коде предупреждение исчезает, но не если
Я бросил (double)x(ii)
,
Любое понимание приветствуется, я довольно неопытен с C ++ и RStudio.
Картина того, что происходит
Для начала не делай
using namespace Rcpp;
using std::exp;
using std::log1p;
Если есть сомнения, будьте явными. Ваш код становится
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::plugins(cpp11)]]
// [[Rcpp::export]]
arma::vec log1pexp(arma::vec x) {
for(size_t ii = 0; ii < x.n_elem; ++ii){
if(x(ii) < 18.0){
x(ii) = std::log1p(std::exp(x(ii)));
} else{
x(ii) = x(ii) + std::exp(-x(ii));
}
}
return x;
}
и скомпилировано без заминки (после того как я тоже поменял int
в size_t
для цикла) — и без проблем в RStudio IDE (используется сравнительно недавняя ежедневная версия 1.0.116).
Есть
std::exp()
в стандартной библиотеке, используя double
Rcpp::exp()
из Rcpp Sugar, используя наши векторыarma::exp()
из броненосца, используя его векторыи я всегда находил, что проще всего быть явным.
Редактировать: Я пропустил log1p
, Добавив префикс std::
также требует C ++ 11. Два изменения сделаны.
Других решений пока нет …