Rcpp:一个函数在NumericVector上工作,另一个需要将其视为标量



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

第一个函数f将 NumericVector 作为输入,并返回 NumericVector 作为输出。但通常,f被视为标量函数。当我从 R 调用它时,这并不重要,因为 R 无论如何都会将任何标量视为向量,所以我不必为此烦恼。我都可以将f用作标量或向量函数,例如f(1)f(c(1,2,3,4)都有效。

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

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

我尝试从g的定义内部做这样的事情:

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

但是代码的计时花费了非常长的时间(因为函数g需要多次执行上述操作(。

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

我目前的解决方案是按照我在 Queston 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;
}

最新更新