我想用查表来加速一些但不是其他的计算。例如,对于正态分布民防部队:
cdf <- pnorm
BINS <- 10
MINZ <- (-5)
MAXZ <- 5
cdftbl <- rep(NA, BINS+2)
xi <- 0; SSZ <- (MAXZ-MINZ)/BINS
while (xi<=BINS+2) {
x <- MINZ+xi*SSZ
cdftbl[xi+1] <- pnorm(x, log=TRUE)
xi <- xi+1
}
fastlogcdf <- function( x, m=0, sd=1 ) {
z <- (x-m)/sd
zi <- (z-MINZ)/(MAXZ-MINZ) * BINS
zi.whole <- as.integer(zi)
zi.frac <- zi-zi.whole
zi.index <- zi.whole+1
zi.tindex <- pmax(1,zi.index) ## will not throw an array index error!
ifelse( (zi.index <= 0) | ((zi.index+1) >= BINS),
pnorm(x,m,sd,log=TRUE),
cdftbl[ zi.index ]+zi.frac*(cdftbl[ zi.index+1 ]-cdftbl[ zi.index ])) }这个用得很好。
fastlogcdf( seq(-2,2,0.5))但不是和
fastlogcdf( seq(-8,8,0.5))因为ifelse希望在基于条件分配之前对这两种结果进行完全评估。通常,我可以忽略这一点,但这会产生一个中间错误,只有0的错误可能与负下标混合。当然,没有cdftable[-8+1]。
一种方法是使用我定义的tindex,但是首先映射到向量中的一些随机无用数,然后丢弃它似乎很奇怪。
唉,即使这个解决方案也不能解决这个问题,因为问题的关键是在表查找完成时避免缓慢的pnorm()调用!因此,我确实需要一个真正的条件,如果只有计算每个向量元素的真正语句侧。
解决这个小难题的R方法是什么?谢谢你的建议。
你好,/iaw
发布于 2016-05-26 02:17:25
没有回答,但我不觉得我能把这写进评论中,对不起:
根据您的函数,以及您如何调用它,m=0和sd=1,这意味着z总是等于x。因此,每当x在MINZ到MAXZ范围之外时,您的表达式:
(z<=MINZ)|(z>=MAXZ) returns TRUE在你的第一个序列(-2 : 2)中,你从来没有遇到过这个(它总是等于假),但是在你的第二个序列(-8 : 8)中你遇到了。所以这是你唯一一次打电话
cdf(x,m,sd,log=TRUE)你的问题很可能在那里。我不知道那是什么功能,你自己定义了吗?
https://stackoverflow.com/questions/37448869
复制相似问题