繁体   English   中英

找到Rcpp中的最小向量

[英]Find minimum of vector in Rcpp

从昨晚开始,我一直在试用Rcppinline ,到目前为止,我真的非常喜欢它。 但是我对C有点新手,只能做基本的东西,而且我很难在网上寻找有关功能等方面的帮助。

我正在研究的是一个在全局环境中找到矢量最小值的函数。 我提出了:

library("inline")
library("Rcpp")

foo <- rnorm(100)

bar <- cxxfunction( signature(),
'
Environment e = Environment::global_env();  
NumericVector foo = e["foo"];
int min;

for (int i = 0; i < foo.size(); i++)
{
    if ( foo[i] < foo[min] ) min = i;
}
return wrap(min+1);
', plugin = "Rcpp")

bar()

但似乎应该有一个更简单的方法来做到这一点,并且它比which.max()慢得多

system.time(replicate(100000,bar()))
   user  system elapsed 
   0.27    0.00    0.26 
system.time(replicate(100000,which.min(foo)))
   user  system elapsed 
    0.2     0.0     0.2 

我是否忽略了这样做的基本c++Rcpp函数? 如果是这样,我在哪里可以找到这样的功能列表?

我想这个问题与以下内容有关: 我在哪里可以学习如何编写C代码来加速慢速R函数?

但不同之处在于我对如何在R加入c++并不感兴趣,而是更多关于如何以及在何处学习R可用的基本c++代码。

很高兴你发现Rcpp很有用。

比利的第一个评论非常正确。 函数查找存在开销,每个元素的[]查找都有开销。

另外,更常见的方法是使用R中的向量,将其传递给通过内联和Rcpp创建的编译函数,并让它返回结果。 试试吧。 包中有很多例子,分散在rcpp-devel邮件列表档案中。

编辑:我忍不住试图建立一个非常C ++ / STL风格的答案。

R> src <- '
+   Rcpp::NumericVector x(xs);
+   Rcpp::NumericVector::iterator it =       // iterator type
+     std::min_element(x.begin(), x.end());  // STL algo
+   return Rcpp::wrap(it - x.begin()); '
R> minfun <- cxxfunction(signature(xs="numeric"), body=src, plugin="Rcpp")
R> minfun(c(7:20, 3:5))
[1] 14
R>

这不是最简单的答案,但它显示了如何使用C ++提供的内容,即使在C ++级别,也可以找到没有(显式)循环的最小元素。 但内置的min()函数仍然更快。

*编辑2:根据Romain的评论进行了修正。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM