Как решать log (0) численно? - PullRequest
       9

Как решать log (0) численно?

0 голосов
/ 03 ноября 2018

Я работаю с идемпотентной матрицей, собственные значения которой либо почти 0, либо 1. Интересующая меня функция:

-e(i)*log(e(i)) - (1-e(i))*log(1-e(i))

, где e(i) - это i-е собственные значения матрицы. Когда собственные значения в точности равны 0, тогда первый член эксплуатируется, и наоборот.

1 Ответ

0 голосов
/ 03 ноября 2018

Есть много способов обойти вызов log(0).

Вы можете разбить выражение на два подвыражения в особых случаях:

auto A = e(i) == 0 ? 0 : -e(i)*log(e(i));
auto B = e(i) == 1 ? 0 : (1-e(i))*log(1-e(i));
return A - B;

Сначала вы можете обработать оба особых случая:

if (e(i) == 0 || e(i) == 1) {
    return 0;
}
return -e(i)*log(e(i)) - (1-e(i))*log(1-e(i))

Вы можете определить свой собственный специальный log:

auto logOrZero = [](double f) -> double {
    return f == 0 ? 0 : log(f);
};
return -e(i)*logOrZero(e(i)) - (1-e(i))*logOrZero(1-e(i));

и т. Д.

В любом случае вы должны быть осторожны не только с передачей нуля на log, но и с передачей значений, близких к нулю, из-за проблем с точностью.

...