首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:快速查表和ifelse矢量化

R:快速查表和ifelse矢量化
EN

Stack Overflow用户
提问于 2016-05-25 22:46:50
回答 1查看 237关注 0票数 0

我想用查表来加速一些但不是其他的计算。例如,对于正态分布民防部队:

代码语言:javascript
复制
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 ]))    }

这个用得很好。

代码语言:javascript
复制
   fastlogcdf( seq(-2,2,0.5))

但不是和

代码语言:javascript
复制
   fastlogcdf( seq(-8,8,0.5))

因为ifelse希望在基于条件分配之前对这两种结果进行完全评估。通常,我可以忽略这一点,但这会产生一个中间错误,只有0的错误可能与负下标混合。当然,没有cdftable[-8+1]

一种方法是使用我定义的tindex,但是首先映射到向量中的一些随机无用数,然后丢弃它似乎很奇怪。

唉,即使这个解决方案也不能解决这个问题,因为问题的关键是在表查找完成时避免缓慢的pnorm()调用!因此,我确实需要一个真正的条件,如果只有计算每个向量元素的真正语句侧。

解决这个小难题的R方法是什么?谢谢你的建议。

你好,/iaw

EN

回答 1

Stack Overflow用户

发布于 2016-05-26 02:17:25

没有回答,但我不觉得我能把这写进评论中,对不起:

根据您的函数,以及您如何调用它,m=0和sd=1,这意味着z总是等于x。因此,每当x在MINZ到MAXZ范围之外时,您的表达式:

代码语言:javascript
复制
(z<=MINZ)|(z>=MAXZ) returns TRUE

在你的第一个序列(-2 : 2)中,你从来没有遇到过这个(它总是等于假),但是在你的第二个序列(-8 : 8)中你遇到了。所以这是你唯一一次打电话

代码语言:javascript
复制
cdf(x,m,sd,log=TRUE)

你的问题很可能在那里。我不知道那是什么功能,你自己定义了吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37448869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档