我已经使用 Eigen 库在 C++ 中实现了 MCMC 算法。该算法的主要部分是一个循环,其中首先执行一些矩阵计算,然后获得结果矩阵的行列式并将其添加到输出中。例如:
MatrixXd delta0;
NumericVector out(3);
out[0] = 0;
out[1] = 0;
for (int i = 0; i < s; i++) {
...
delta0 = V*(A.cast<double>()-(A+B).cast<double>()*theta.asDiagonal());
...
I = delta0.determinant()
out[1] += I;
out[2] += std::sqrt(I);
}
return out;
现在,在某些矩阵上,我不幸观察到数值下溢,因此行列式输出为零(实际上不是)。
我怎样才能避免这种下溢?
一种解决方案是获取行列式的对数,而不是行列式。然而,
- 我不知道该怎么做;
- 我怎么能把这些日志加起来?
任何帮助是极大的赞赏。