Подтвердить что ты не робот

Реализация logsumexp в C?

Кто-нибудь знает библиотеку C с открытым исходным кодом, которая предоставляет logsumexp -функцию?

Функция logsumexp(a) вычисляет сумму экспонент log (e ^ {a_1} +... e ^ {a_n}) компонентов массива a, избегая численного переполнения.

4b9b3361

Ответ 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 аргументов, вам нужно добавить к нему случай:)