gpt4 book ai didi

c++ - 在 Rcpp 中找到 vector 的最小值

转载 作者:可可西里 更新时间:2023-11-01 18:27:39 26 4
gpt4 key购买 nike

从昨晚开始,我一直在尝试 Rcppinline,到目前为止我真的很享受。但总的来说,我对 C 有点陌生,目前只能做一些基本的事情,而且我很难在网上找到函数等方面的帮助。

我正在研究的是一个函数,它可以在全局环境中找到一个 vector 的最小值。我想到了:

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 函数?如果是这样,我在哪里可以找到此类函数的列表?

我想这个问题与: Where can I learn how to write C code to speed up slow R functions?

但不同的是,我对如何将 c++ 合并到 R 中并不真正感兴趣,但更感兴趣的是如何以及在哪里学习基本的 c++R 中可用的代码。

最佳答案

很高兴您发现 Rcpp 很有用。

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

此外,一种更常见的方法是采用 R 中的 vector ,将其传递给通过内联和 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 的评论进行了更正。

关于c++ - 在 Rcpp 中找到 vector 的最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5158219/

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