Я реализовал алгоритм MCMC на C++, используя библиотеку Eigen. Основная часть алгоритма представляет собой цикл, в котором сначала выполняются некоторые матричные вычисления, после чего получается определитель полученной матрицы и добавляется к выходу. Например.:
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;
Теперь на некоторых матрицах я, к сожалению, наблюдаю численное занижение значения, так что определитель выводится как ноль (что на самом деле не так).
Как избежать этого недостаточного потока?
Одним из решений было бы получение вместо определителя логарифма определителя. Однако,
- Я не знаю, как это сделать;
- как я мог тогда сложить эти журналы?
Любая помощь приветствуется.