2017-04-27 11 views
0

(ダブル入力から)ガンマ関数を利用する元のR関数を(R)cppに書き直そうとしています。元のソースの下。 sourceCppをコンパイルすると、次のエラーが発生します。 "ガンマ(Rcpp :: traits :: storage_type(< 14>:タイプ)の呼び出しに一致する関数がありません"Rcppガンマ積分

ガンマ関数は、 。。あなたは仕事がベクトル化されRcpp砂糖のポイントとして、この複雑すぎるを作っているの使用以下の平均として)ので、私は簡単にそこに呼ばれるべき期待

#include <Rcpp.h> 
#include <math.h> 
using namespace Rcpp; 


// original R function 
// function (y_pred, y_true) 
// { 
// eps <- 1e-15 
// y_pred <- pmax(y_pred, eps) 
// Poisson_LogLoss <- mean(log(gamma(y_true + 1)) + y_pred - 
//  log(y_pred) * y_true) 
// return(Poisson_LogLoss) 
// } 


// [[Rcpp::export]] 
double poissonLogLoss(NumericVector predicted, NumericVector actual) { 
    NumericVector temp, y_pred_new; 
    double out; 
    const double eps=1e-15; 

    y_pred_new=pmax(predicted,eps); 
    long n = predicted.size(); 
    for (long i = 0; i < n; ++i) { 
    temp[i] = log(gamma(actual[i]+1)+y_pred_new[i]-log(y_pred_new[i])*actual[i]); 
    } 

    out=mean(temp); // using sugar implementation 
    return out; 
} 

答えて

3

ので、以下は同様にコンパイルされます。

#include <Rcpp.h> 
#include <math.h> 
using namespace Rcpp; 

// [[Rcpp::export]] 
double poissonLogLoss(NumericVector predicted, NumericVector actual) { 
    NumericVector temp, y_pred_new; 
    double out; 
    const double eps=1e-15; 

    y_pred_new=pmax(predicted,eps); 
    temp = log(gamma(actual + 1)) + y_pred_new - log(y_pred_new)*actual; 
    out=mean(temp); // using sugar implementation 
    return out; 
} 

今、テストデータを提供していないので、私はこれが正しく計算されるかどうかは分かりません。また、あなたのR式がすでにベクトル化されているので、これはそれほど速くはありません。

最後に、あなたがdoubleを提供していたのに対し、Sugar関数gamma()がRcppオブジェクトを期待しているために、コンパイルエラーが発生している可能性があります。

+0

正常に動作します。あなたの説明とサポートをありがとう! –