2010-11-12 13 views
11

logsumexp işlevini sağlayan açık kaynaklı sayısal C kitaplığından herhangi biri var mı?logsumexp uygulaması?

logsumexp(a) işlevi, dizinin a bileşenlerinin üstel adlarının toplamını (e^{a_1} + ... e^{a_n}) toplayarak sayısal taşmayı önler.

cevap

10

Burada sıfırdan çok basit uygulama (test edilen en az minimal,) var:

Bu uçta geri etkili bir daha sonra günlüğünü ekleyerek, büyük iddiaların hepsi bölünmesi hile yok
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; 
} 

taşmayı önlemek için, bazı argümanların diğerlerinden daha büyük büyüklükteki emirleri olması durumunda, sürünen hatalarla birlikte, benzer şekilde ölçeklendirilmiş çok sayıda değer eklenmesi iyi bir davranışdır. Eğer 0 argümanlar verildiğinde çarpmadan çalıştırmak istiyorsanız

, bunun için bir durumda eklemek gerekecek :)

+2

Shame on you Hobbs. 'Size_t' işini yapmak için bir int kullanmaktan daha iyi bilmelisiniz. –

+1

Suçlu olarak ücretlendirildi. C benim için bir hobi haline geldi. Onu tamir edeceğim. – hobbs