[英]Find minimum of vector in Rcpp
从昨晚开始,我一直在试用Rcpp
和inline
,到目前为止,我真的非常喜欢它。 但是我对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.