rcpp: как применить гамма-функцию к скаляру?

Я думаю, функция gamma only works for a vector as the input. Is there a way to apply it to a scalar, say,гамма (3)`?

На самом деле, я бы получил правильный вывод, если я включу gamma(3) как часть моего кода, но есть предупреждение....

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
List fool(NumericVector vec){
  double res = 0;
  res = sum(gamma(vec)) + gamma(3);
  List result;result["num"] = res;
   return result;
}

Вот предупреждающие сообщения:

exp.cpp: 7: 27: предупреждение: "гамма" устарела: первая устарела в OS X 10.9 [-Wdeprecated-декларации]
res = сумма (гамма (vec)) + гамма (3);
^ /usr/include/math.h:720:15: примечание: "гамма" явно помечена как устаревшая здесь extern double gamma(double) __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_0, __MAC_10_9, __IPHONE_NA, __IPHONE_) ^ 1 предупреждение сгенерировано.

1 ответ

Решение

Спасибо за размещение кода. Вы стали жертвой небрежности с пространствами имен. Существует (векторизация) gamma() в пространстве имен Rcpp - первый аргумент и есть (был) скаляр gamma() (Предпочтительный: tgamma()) в C математической библиотеке. И лучше быть явным.

Исправленный код ниже:

#include <Rcpp.h>

// [[Rcpp::export]]
double fool(Rcpp::NumericVector vec){
    double res =
        Rcpp::sum(Rcpp::gamma(vec)) +   // Rcpp sugar sum() and gamma() on vector
        ::tgamma(3.0);                  // math library tgamma of double
    return res;
}

/*** R
v <- 1:5
fool(v)
sum(gamma(v)) + gamma(3)
*/

Выход

R> sourceCpp("/tmp/shuang.cpp")

R> v <- 1:5

R> fool(v)
[1] 36

R> sum(gamma(v)) + gamma(3)
[1] 36
R> 
Другие вопросы по тегам