【问题标题】:rcpp: how to apply gamma function to a scalar?rcpp:如何将伽玛函数应用于标量?
【发布时间】:2018-04-16 18:16:33
【问题描述】:

我猜是函数gamma only works for a vector as the input. Is there a way to apply it to a scalar, say,gamma(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: 警告:'gamma' 已弃用:在 OS X 10.9 中首次弃用 [-Wdeprecated-declarations]
res = sum(gamma(vec)) + gamma(3);
^ /usr/include/math.h:720:15:注意:“gamma”已在此处明确标记为已弃用 外部双伽马(双)__OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_0,__MAC_10_9,__IPHONE_NA,__IPHONE_NA); ^ 生成了 1 个警告。

【问题讨论】:

  • 警告消息来自代码中的其他地方,因为3 是一个向量,而gamma(3) 返回2,正如预期的那样。
  • 请显示代码和警告信息。请参阅 how to make a great reproducible example 获取有用的建议。
  • 抱歉不清楚。我在这里附上了我的代码:)

标签: r rcpp gamma-function


【解决方案1】:

感谢您发布代码。您因粗心使用名称空间而成为受害者。在 Rcpp 命名空间中有一个(向量化的)gamma()——第一个参数,并且在 C 数学库中有一个标量 gamma()(首选:tgamma())。最好是明确的。

更正以下代码:

#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> 

【讨论】:

  • 不用担心,很高兴它有帮助!有时是小事。随意“接受”(点击勾选标记;也给你信用)和/或“upvote”(点击向上三角形),这是在 StackOverflow 上给予信用的方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多