在C ++中计算log-sum-exp函数

泰勒

c ++标准库中是否有任何函数可以计算指数和的对数?如果没有,我应该如何编写自己的书?您有此Wiki文章中未提及的任何建议吗?

我特别担心加总会下溢在这种情况下,您需要对绝对值较大的负数求幂。我正在使用c ++ 11。

杂项

(shuvro代码的C ++ 11变体,根据问题使用标准库。)

template <typename Iter>
std::iterator_traits<Iter>::value_type
log_sum_exp(Iter begin, Iter end)
{
  using VT = std::iterator_traits<Iter>::value_type{};
  if (begin==end) return VT{};
  using std::exp;
  using std::log;
  auto max_elem = *std::max_element(begin, end);
  auto sum = std::accumulate(begin, end, VT{}, 
     [max_elem](VT a, VT b) { return a + exp(b - max_elem); });
  return max_elem + log(sum);
}

该版本更为通用-只要具有相关的运算符,它就可以在任何类型的值,任何类型的容器中使用。特别是,它将使用std::exp和,std::log除非值类型具有其自身的重载。

为了真正强大地抵抗下溢,即使对于未知的数字类型,对值进行排序也可能会有所帮助。如果对输入进行排序,则第一个值将是max_elem,因此第一个项sumexp(VT{0}VT{1}显然没有下溢。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章