如何用数字处理log(0)
How to tackle log(0) numerically?
我正在处理一个幂等矩阵,其特征值接近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
,还应该小心传递接近零的值。
相关文章:
- 如何用数字处理log(0)
- 如何检查 2 个 c++ 数组在 O(1) 或 O(log n) 时间复杂度中是否相同(所有元素都相同,顺序很重要)?
- 如何用零填充 3D 数组?
- boost.log-如何用附加和旋转配置text_file_backend
- 如何用行、列和值初始化 cv::Mat 数组?(在 c++ 类中)
- inheritance:如何用相同的函数生成一个不同类的数组,这些类在C++中做不同的事情
- 如何用'n'维数组声明 std::vector?
- C 如何用数组在类中创建子类
- 如何用c++将一个向量数组放入一个一维数组中
- 如何用汇编语言编写模数(C++中的%)
- 如何用每种可能的组合填充 2D 数组?C++逻辑
- 如何用c++将文件夹中的文件名存储到数组中
- 如何在log(n)时间内找到数组任何范围内的最大值
- 如何用0和1填充2D数组,其中第N行的每个第N个元素都是1,其余元素是0
- 1D数组,如何用C++制作行和列
- 如何用C++数组初始化OpenCL常量向量?[主持人]
- 如何用QT删除c++中的浮动2D数组
- 如何用c++在sql连接中插入数组元素
- 如何用数组初始化一个glm::mat4
- 如何用数组实现一个紧凑的链表