问题 logs中的logsumexp实现?


有没有人知道提供的开源数值C库 logsumexp-功能?

logsumexp(a) 函数计算数组a的分量的指数log(e ^ {a_1} + ... e ^ {a_n})之和,避免数值溢出。


10857
2017-11-12 23:35


起源



答案:


这是一个从头开始的非常简单的实现(经过测试,至少是最低限度):

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参数的情况下运行而不会崩溃,那么你必须为它添加一个案例:)


10
2017-11-12 23:54



羞辱你,霍布斯。你应该知道比使用一个更好 int 做一个 size_t的工作。 - Chris Lutz
收费有罪。 C对我来说已经成为一种爱好。我会解决它。 - hobbs


答案:


这是一个从头开始的非常简单的实现(经过测试,至少是最低限度):

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参数的情况下运行而不会崩溃,那么你必须为它添加一个案例:)


10
2017-11-12 23:54



羞辱你,霍布斯。你应该知道比使用一个更好 int 做一个 size_t的工作。 - Chris Lutz
收费有罪。 C对我来说已经成为一种爱好。我会解决它。 - hobbs