2010-11-12 38 views
11

是否有人知道提供了logsumexp功能的開源數字C庫?logsumexp在C中的實現?

logsumexp(a)函數計算數組a的組成部分的指數log(e^{a_1} + ... e^{a_n})的和,從而避免數值溢出。

回答

10

這裏是一個從無到有的非常簡單的實現(經測試,至少最低限度):

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參數時崩潰運行,你就必須添加的情況下爲:)

+2

你感到羞恥,霍布斯。你應該知道使用'int'來完成'size_t'的工作。 – 2010-11-13 01:20:32

+1

有罪。 C對我來說更像是一種愛好。我會解決它。 – hobbs 2010-11-13 02:27:24