В Eigen есть довольно полезная функция, которая называется isFinite, которая выполняет итерацию по матрице, проверяет соответствующее значение для NAN и INF и используется следующим образом:
#include <iostream>
#include <Eigen/Dense>
#include <vector>
#include <numeric>
namespace eig = Eigen;
int main() {
eig::MatrixXd e(2, 2);
e << 8.0, std::nan("1"), std::numeric_limits <double> ::infinity(), 4.0;
std::cout << e << std::endl;
e = (e.array().isFinite()).select(e, 0.0);
std::cout << e << std::endl;
return 0;
}
// Output:
//
// 8 nan
// inf 4
// 8 0
// 0 4
Также есть функция, которая называется isZero, но применительно к матрице возвращает только логическое значение. У меня вопрос, есть ли функция, которая делает то же самое, что isFinite, но проверяет значения, например, ноль?
Редактировать:
Спасибо, я выбрал версию с abs (), но есть кое-что, что смущает меня: когда я делаю следующее:
int main() {
eig::MatrixXd e_1(2, 2);
eig::MatrixXd e_2(2, 2);
e_1 << 8, 2, 3, 4;
e_2 << 1, 0, 0, 2;
e_1 = (e_2.array().abs() < 1.0E-10).select(e_1, 0.0);
std::cout << e_1 << std::endl;
}
// Output:
//
// 0 2
// 3 0
Код делает противоположное тому, что я думаю, он изменяет записи e_1 на ноль, в которых e_2 НЕ ноль, поэтому я должен перевернуть знак меньше, чем знак больше, чем знак. Почему это так?