a***r 发帖数: 420 | 1 处理一堆1E-300左右的数,统统log之
为了需要相加的时候,写了个小function:
logsum <- function(obj) {
vect=as.vector(obj)
logsumm = -Inf
for (i in 1:length(vect)) {
temp=vect[i]
if (temp>-Inf) {
logsumm=temp+log(1+exp(logsumm-temp))
}
}
return (logsumm)
}
#ie. a=c(1E-10,1E-20,1E-200); b=log(a); then: logsum(b)=log(sum(a))
似乎运行得很好
可是今天发现一个bug(?),以下e是在实际计算中产生的array,需对里面每个element求
和,不辞
辛劳地抄下来,give you a flavor of how puzzled I am...:
>e=array(c(-384.1895,-299.9747,-512.4600,-591.3290,-299.9747,-278.6766,-
452.5766,-503.6044,-512.4600,-452.5766,-865.9097,-910.4460,-591.3290,-
503.6004,-910.4460,-998.8651),dim=c(4,4))
> e
[,1] [,2] [,3] [,4]
[1,] -384.1895 -299.9747 -512.4600 -591.3290
[2,] -299.9747 -278.6766 -452.5766 -503.6004
[3,] -512.4600 -452.5766 -865.9097 -910.4460
[4,] -591.3290 -503.6044 -910.4460 -998.8651
>logsum(e)
[1] Inf
我迷惘了。。。求高人指点,这是为啥哩。。。 | d******e 发帖数: 7844 | 2 google logsumexp
【在 a***r 的大作中提到】 : 处理一堆1E-300左右的数,统统log之 : 为了需要相加的时候,写了个小function: : logsum <- function(obj) { : vect=as.vector(obj) : logsumm = -Inf : for (i in 1:length(vect)) { : temp=vect[i] : if (temp>-Inf) { : logsumm=temp+log(1+exp(logsumm-temp)) : }
| g**********t 发帖数: 475 | 3 可能是logsumm-temp为正且比较大,导致求指数的时候溢出。可以考虑在求和之前比较
logsumm和temp,如果logsumm大的话交换两者的值以保证不会向上溢出。 |
|