logsumexp在C中的实现?
有人知道一个开源的数字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
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;
}