如何用数字处理log(0)



我正在处理一个幂等矩阵,其特征值接近01。我感兴趣的功能是

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

其中CCD_ 3是矩阵的第i个特征值。当特征值恰好为0时,则第一项利用,反之亦然。

有很多方法可以处理对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,还应该小心传递接近零的值。

最新更新