gpt4 book ai didi

c++ - Rcpp:一个函数适用于 NumericVector,另一个需要将其视为标量

转载 作者:行者123 更新时间:2023-11-30 04:44:10 25 4
gpt4 key购买 nike

我有两个用 Rcpp 编写的函数。

第一个函数f将 NumericVector 作为输入并返回 NumericVector 作为输出。但通常,f意味着被视为标量函数。当我从 R 调用它时,没关系,因为 R 无论如何都会将任何标量视为 vector ,所以我不必为此操心。我都可以使用 f作为标量或 vector 函数,例如f(1)f(c(1,2,3,4)两者都有效。

  1. 问题 1:这是个坏主意吗?我应该制作两个独立的函数,一个是标量函数,一个是向量化函数吗?例如,当我调用 f 时是否有一些不需要的开销?从 R 使用标量输入而不是 vector ?

第二个函数g需要使用 f纯粹作为标量函数。这会导致问题,因为我需要调用 f当我定义 g 时来自 Rcpp .... 现在我不能通过调用 f(x 将其用作标量函数) 对于一些双 x。

我尝试在 g 的定义中做类似的事情:

NumericVector x = NumericVector::create(value); //create vector of length 1
f(x) //use f(x) as scalar

但代码的计时时间长得离谱(因为函数 g 需要多次执行上述操作)。

  1. 问题 2:有没有办法更快地治疗 f作为标量函数,就像我在 R 中一样?

我目前的解决方案是按照我在问题 1 中的要求进行操作:创建另一个 f标量函数,然后从 g 中调用那个函数, 所以里面g我们只是说

alternative_f(x) //use alternative f as scalar

最佳答案

您可以将标量代码分解为一个单独的(内联)函数,并从 f(使用 std::transform)和 g< 调用它(+附加逻辑)。简化示例:

#include <Rcpp.h>

inline double f_impl (double x) {
return x * 2;
}


// [[Rcpp::export]]
double g (double x) {
return f_impl(x) + 2;
}

// [[Rcpp::export]]
Rcpp::NumericVector f (Rcpp::NumericVector x) {
Rcpp::NumericVector y(Rcpp::no_init(x.length()));
std::transform(x.begin(), x.end(), y.begin(), f_impl);
return y;
}

关于c++ - Rcpp:一个函数适用于 NumericVector,另一个需要将其视为标量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57893254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com