【问题标题】:R Rcpp how to use a vector in powR Rcpp如何在pow中使用向量
【发布时间】:2021-08-19 18:16:19
【问题描述】:

我想将带有功率元素 (x^y) 的 R 代码转换为 Rcpp。 Rcpp 使用 pow(x,y) 但它似乎没有被矢量化。以下示例返回 NaN NaN。

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
NumericVector vecTest(NumericVector x) {
  
  return pow(x, 0.25);
}

/*** R
test <- c(-1.19556e+12, -1.24111e+12)
vecTest(test)
*/

我可以编写一个 for 循环来遍历 x 向量的元素,但我想知道我是否缺少某些东西。

【问题讨论】:

  • 嗯。这个问题使它看起来像基础矢量化:stackoverflow.com/questions/30106492/…
  • c(-1.19556e+12, -1.24111e+12)^ .25 return NaN NaN 在 R 中也是如此(所以这不仅仅是 Rcpp 的事情)。您期待什么值?
  • 你知道你试图在你的例子中留下实数吗?

标签: r rcpp


【解决方案1】:

有时会有所帮助

  • 查看定义要使用的函数的头文件

  • 看看一些单元测试部署你想使用的功能

  • 让你的例子简单

  • 稍微改变参数

  • 确保您从要访问的命名空间中访问了函数

代码

#include <Rcpp.h>

// [[Rcpp::export]]
Rcpp::NumericVector mypow(Rcpp::NumericVector x, double expo) {
    return Rcpp::pow(x, expo);
}

/*** R
v <- c(2, 3, 4, 1.2e12, -1.2e12)
mypow(v, 2)
mypow(v, 0.5)
*/

输出

> Rcpp::sourceCpp("~/git/stackoverflow/68852817/answer.cpp")

> v <- c(2,3,4)

> mypow(v, 2)
[1] 4.00e+00 9.00e+00 1.60e+01 1.44e+24 1.44e+24

> mypow(v, 0.5)
[1] 1.41421e+00 1.73205e+00 2.00000e+00 1.09545e+06         NaN
> 

似乎像宣传的那样工作。标量取幂的向量参数。

编辑: 更新以在您的示例中显示一些“大”值。负实数的根不起作用,但这是一个数学问题,而不是编译器、库或包的问题。

【讨论】:

  • 我希望这个例子符合简单的标准。我不知道在哪里可以找到头文件;事实上,我不认为我知道有一个。我很确定你不是指 Rcpp.h。我也不完全清楚单元测试是什么。我确实对指数的整数值以及像 1./4 这样的简单计算进行了实验。而不是 0.25。一旦我了解你的 mypow 函数,它就会因对新手的微妙、优雅和事后显而易见性而获得细高跟鞋奖(即比锤子更精确)。
  • 您可能只是想冲一杯像样的咖啡,然后开始探索您正在处理开源源的事实。您在此处使用的每个包都有源代码。 代码就是文档Rcpp.h 标头调用(很多!!)其他标头,这可能难以阅读,但至少它在那里。至于单元测试,那是我最喜欢的源代码,通过使用tinyest,Rcpp 的一个与软件包一起安装。只需查看已安装软件包的子目录即可。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多