2010-11-12 39 views
11

Có ai biết thư viện số C mã nguồn mở cung cấp chức năng logsumexp không?triển khai logumexp trong C?

Hàm logsumexp(a) tính tổng của hàm mũ (e^{a_1} + ... e^{a_n}) của các thành phần của mảng a, tránh tràn số.

Trả lời

10

Dưới đây là một thực hiện rất đơn giản từ đầu (thử nghiệm, ít nhất là tối thiểu):

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; 
} 

này hiện các trick chia một cách hiệu quả tất cả các đối số bằng lớn nhất, sau đó thêm log của nó trở lại trong lúc kết thúc để tránh tràn, do đó, nó cư xử tốt cho việc thêm một số lượng lớn các giá trị có tỷ lệ tương tự, với các lỗi leo trong nếu một số đối số có nhiều đơn đặt hàng lớn hơn các giá trị khác.

Nếu bạn muốn nó chạy mà không bị rơi khi đưa ra 0 đối số, bạn sẽ phải thêm một trường hợp cho điều đó :)

+2

Xấu hổ với bạn, hobbs. Bạn nên biết rõ hơn là sử dụng 'int' để thực hiện công việc' size_t'. –

+1

Có tội là bị tính phí. C đã trở thành một sở thích của tôi. Tôi sẽ sửa chữa nó. – hobbs