11

関数を提供するオープンソースの数値 C ライブラリを知っている人はいlogsumexpますか?

このlogsumexp(a)関数は、数値オーバーフローを回避して、配列 a のコンポーネントの指数 log(e^{a_1}+...e^{a_n}) の合計を計算します。

4

1 に答える 1

11

これはゼロからの非常に単純な実装です (少なくとも最小限のテスト済み):

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 の場合にクラッシュせずに実行したい場合は、そのためのケースを追加する必要があります:)

于 2010-11-12T23:54:54.197 に答える