我正在处理一个幂等矩阵,其特征值接近0
或1
。我感兴趣的功能是
-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
,还应该小心传递接近零的值。