【问题标题】:logsumexp implementation in C?C语言中的logsumexp实现?
【发布时间】:2011-05-09 08:55:11
【问题描述】:

有人知道提供logsumexp-函数的开源数字C 库吗?

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

【问题讨论】:

    标签: c numerical


    【解决方案1】:

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

    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 个参数时运行而不会崩溃,则必须为此添加一个案例:)

    【讨论】:

    • 你真丢脸,霍布斯。您应该知道不要使用int 来完成size_t 的工作。
    • 被指控有罪。 C对我来说更像是一种爱好。我会解决的。
    猜你喜欢
    • 2012-06-07
    • 2013-11-25
    • 2014-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 2023-03-07
    相关资源
    最近更新 更多