Rcpp Armadillo: RStudio говорит «exp» неоднозначно

Я пробую 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.

Картина того, что происходит

введите описание изображения здесь

2

Решение

Для начала не делай

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. Два изменения сделаны.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]