Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
logsumexp在C中的实现?_C_Numerical - Fatal编程技术网

logsumexp在C中的实现?

logsumexp在C中的实现?,c,numerical,C,Numerical,有人知道一个开源的数字C库,它提供了logsumexp-函数吗 logsumexp(a)函数计算数组a的组件的指数log(e^{a_1}+…e^{a_n})之和,以避免数值溢出。这里是一个从头开始的非常简单的实现(至少经过最低限度的测试): double logsumexp(双nums[],大小\u t ct){ 双最大值exp=nums[0],总和=0.0; 尺寸i; 对于(i=1;imax\u exp) max_exp=nums[i]; 对于(i=0;i

有人知道一个开源的数字C库,它提供了
logsumexp
-函数吗


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

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

double logsumexp(双nums[],大小\u t ct){
双最大值exp=nums[0],总和=0.0;
尺寸i;
对于(i=1;imax\u exp)
max_exp=nums[i];
对于(i=0;i
这样做可以有效地将所有参数除以最大值,然后在最后添加其日志以避免溢出,因此添加大量类似比例的值是很好的,如果某些参数比其他参数大很多数量级,则会出现错误


如果您想让它在给定0个参数的情况下运行而不崩溃,那么您必须为此添加一个案例:)

真丢脸,霍布斯。你应该知道不要用
int
来做
size\t
的工作。罪名成立。对我来说,C已成为一种爱好。我会修好的。
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;
}