Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Rcpp能否取代R中的unif功能?_C++_R_Rcpp - Fatal编程技术网

C++ Rcpp能否取代R中的unif功能?

C++ Rcpp能否取代R中的unif功能?,c++,r,rcpp,C++,R,Rcpp,我刚刚开始在R中使用Rcpp软件包,我的学习灵感来自Hadley Wickham的高级R课程 在R studio中,我有以下.cpp文件。这个问题更一般,但这个例子有帮助 #include <Rcpp.h> using namespace Rcpp; // [[Rcpp::export]] NumericVector runifC(int n, double min=0, double max=1) { NumericVector out(n); for(int i =

我刚刚开始在R中使用
Rcpp
软件包,我的学习灵感来自Hadley Wickham的高级R课程

在R studio中,我有以下.cpp文件。这个问题更一般,但这个例子有帮助

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
NumericVector runifC(int n, double min=0, double max=1) {
  NumericVector out(n);

  for(int i = 0; i < n; ++i) {
    out[i] = min + ((double) rand() / (RAND_MAX)) * (max - min);
  }
  return out;
}

/*** R
library(microbenchmark)
microbenchmark(
  'R unif-1'      = runif(1),
  'C++ unif-1'    = runifC(1),
  'R unif-100'    = runif(100),
  'C++ unif-100'  = runifC(100),
  'R unif-1000'   = runif(1000),
  'C++ unif-1000' = runifC(1000),
  'R unif-100000'   = runif(100000),
  'C++ unif-100000' = runifC(100000)
)
*/
<>我希望<>代码> RunIv/Cuth>是一个非常优化的函数,但是C++代码运行得更有效。在这里我可能是天真的,但是如果性能有如此不同,那么为什么所有的应用函数都不能用C++重写呢?p>

看起来很明显,有很多改进的可能,我觉得好像我错过了一个巨大的原因,为什么不把所有的R函数都盲目地复制到C++中去执行。p>


< > > >编辑< /强>:对于这个例子,已经显示了> RAND()/C++代码的C++实现有点缺陷。我注意到的性能差距主要使用
rand()
函数。其他函数的性能似乎没有那么剧烈,所以我更改了问题的名称

从R-3.1.1开始,
runif
使用
.External
接口复制其参数。Luke Tierney将此更改为在中的R-devel中使用
.Call
接口。
.Call
接口不复制其参数。Rcpp使用
.Call
接口



<>你的C++代码在R DEVEL下仍然更快(使用<代码>。这可能是因为所使用的随机数生成器存在差异。而且,R的函数通常比您编写的任何专用代码都有更多的检查;这些检查需要时间。

请不要使用
rand()
。如果你提交了你的包裹,那么这样做也会使你的包裹从CRAN上脱落

有关警告,请参见eg:

注释

对于生成的随机序列的质量没有任何保证。在过去,rand()的一些实现在生成的序列的随机性、分布和周期方面存在严重缺陷(在一个众所周知的示例中,低阶位只是在调用之间在1和0之间交替)

如果您对备用随机数生成器和计时感兴趣,请参阅


一般来说,使用R提供的生成器,这些生成器具有出色的统计质量,并且由Rcpp以标量和矢量形式(“Rcpp Sugar”)提供。

随机数状态的存储和检索可能会出现问题;我不知道
rand()。R的RNG被认为更好,即“更随机”。你的另一个例子很愚蠢。你已经知道你的
runif
函数比R快,那么为什么你要在
cumsum
基准测试的计时中包含这一点呢?@cantdutchthis一般来说,不要相信你读到的所有东西。这真的是对“Rcpp可以替换R中的所有(或许多)函数”问题的回答吗?(顺便说一句,我本以为答案只是“是的”)在“只要你不做任何愚蠢的事情,比如调用
rand()
”的感觉中。但这实际上只是重申了图灵等价性。
Unit: nanoseconds
             expr     min        lq       mean    median        uq     max neval
         R unif-1    2061    2644.5    4000.71    3456.0    4297.0   15402   100
       C++ unif-1     710    1190.0    1815.11    1685.0    2168.5    5776   100
       R unif-100    4717    5566.5    6794.14    6563.0    7435.5   16600   100
     C++ unif-100    1450    1997.5    2663.29    2591.5    3107.0    5307   100
      R unif-1000   28210   29584.5   31310.54   30380.0   31599.0   52879   100
    C++ unif-1000    8292    8951.0   10113.78    9462.5   10121.5   25099   100
    R unif-100000 2642581 2975117.0 3104580.62 3030938.5 3119489.0 5435046   100
  C++ unif-100000  699833  990924.0 1058855.49 1034430.5 1075078.0 1530351   100