有人知道提供logsumexp
- 函数的开源数值C库吗?
logsumexp(a)
函数计算数组a的组分的指数log(e ^ {a_1} + ... e ^ {a_n})之和,避免数值溢出。
答案 0 :(得分:10)
这是一个从头开始的非常简单的实现(经过测试,至少是最低限度):
double logsumexp(double nums[], size_t ct) {
double max_exp = nums[0], sum = 0.0;
size_t i;
for (i = 1 ; i < ct ; i++)
if (nums[i] > max_exp)
max_exp = nums[i];
for (i = 0; i < ct ; i++)
sum += exp(nums[i] - max_exp);
return log(sum) + max_exp;
}
这样可以有效地将所有参数除以最大值,然后在最后添加其日志以避免溢出,因此它可以很好地添加大量类似比例的值,并且错误会逐渐消失如果某些论点比其他论点大许多个数量级。
如果你希望它在没有崩溃的情况下运行时给出0参数,你将不得不为此添加一个案例:)