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