Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.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++ 提高R性能或将R函数转换为C++;作用_C++_R - Fatal编程技术网

C++ 提高R性能或将R函数转换为C++;作用

C++ 提高R性能或将R函数转换为C++;作用,c++,r,C++,R,我有一个R函数来计算整数k的概率;k=1,…,m,与其他参数的给定值之差。当k的大小非常大(例如,m=10000)时,功能非常慢。您对改进该功能的性能有什么建议吗 我也想在C++中创建一个等效函数,如果需要的话,我可以使用R的RCPP包,但是我不知道C++。在学习C++之前,我也希望能有你的建议。 prob <- function(k, et, ey, nrep = 10000, m0, m1) { m = m0 + m1 t <- rnorm(nrep, et, 1

我有一个R函数来计算整数k的概率;k=1,…,m,与其他参数的给定值之差。当k的大小非常大(例如,m=10000)时,功能非常慢。您对改进该功能的性能有什么建议吗

<>我也想在C++中创建一个等效函数,如果需要的话,我可以使用R的RCPP包,但是我不知道C++。在学习C++之前,我也希望能有你的建议。
prob <- function(k, et, ey, nrep = 10000, m0, m1)
{
    m = m0 + m1
    t <- rnorm(nrep, et, 1)
    p0 <- pnorm(-t)
    p1 <- pnorm(ey - t)

    mean0 <- (m0 - 1)*p0 + m1*p1 + 1
    mean1 <- m0*p0 + (m1 - 1)*p1 + 1

    var0 <- (m0 - 1)*p0*(1 - p0) + m1*p1*(1 - p1)
    var1 <- m0*p0*(1 - p0) + (m1 - 1)*p1*(1 - p1)

    prob <- ifelse(et == 0, mean(dnorm(k, mean0, sqrt(var0))),
                   mean(dnorm(k, mean1, sqrt(var1))))

    return(prob)
}

prob由于
dnorm
是一个向量化函数,您可以像这样调用
prob

prob_k <- prob(1:10000, et = 1, ey = 1 ,m0 = 5000, m1 = 5000)

prob\k您将以何种形式向函数提供数据?关键是从头开始矢量化,C++中的编码是最后的手段,但这并不是给我K= 1:1000的概率。它只给出一个值是的,这是固定的。我还更新了基准数据。所需的时间没有改变,谢谢你的努力。现在的问题是,新函数并没有提供与理论所建议的相同的结果。如果你把et=ey=0,那么prob_k应该是均匀分布的,所有的概率应该接近1/10000。
prob_k <- prob(1:10000, et = 1, ey = 1 ,m0 = 5000, m1 = 5000)
prob <- function(k, et, ey, nrep = 10000, m0, m1)
{
  m = m0 + m1
  t <- rnorm(nrep, et, 1)
  p0 <- pnorm(-t)
  p1 <- pnorm(ey - t)

  mean0 <- (m0 - 1)*p0 + m1*p1 + 1
  mean1 <- m0*p0 + (m1 - 1)*p1 + 1

  var0 <- (m0 - 1)*p0*(1 - p0) + m1*p1*(1 - p1)
  var1 <- m0*p0*(1 - p0) + (m1 - 1)*p1*(1 - p1)

  if( et == 0 )
    dnorm(k, mean0, sqrt(var0))
  else
    dnorm(k, mean1, sqrt(var1))
}
microbenchmark(prob_k <- prob(1:10000, et = 1, ey = 1 ,m0 = 5000, m1 = 5000))
# Unit: milliseconds
#                                                           expr     min
#  prob_k <- prob(1:10000, et = 1, ey = 1, m0 = 5000, m1 = 5000) 4.68232
#        lq     mean   median       uq      max neval
#  4.776912 5.168405 4.817979 4.907612 7.023989   100