Я занимаюсь большим научным программированием и получил очень хороший опыт работы с обоими объектами Boost.Units, которые обеспечивают размерный анализ во время компиляции для величин (т. Е. Помечают величины единицами и тем самым обнаруживают множество ошибок при анализе классических физических измерений). и используя Eigen 2 для линейной алгебры.
Однако у Эйгена нет понятия единиц, и, хотя вы можете установить скалярные величины в матрицах для Эйгена, он ожидает, что умножение двух величин даст один и тот же тип, что, очевидно, неверно для единиц. Например, код вроде:
using boost::units::quantity;
namespace si = boost::units::si;
Eigen::Matrix< quantity< si::length >, 2, 1 > meter_vector;
quantity< si::area > norm = meter_vector.squaredNorm();
не работает, хотя логически правильно.
Есть ли матричная библиотека, которая поддерживает единицы измерения? Я знаю, что это было бы сложно реализовать в прошлом, и C ++ 11 и decltype
сделают это намного проще, но это, конечно, было возможно с C ++ 03 и специализациями шаблонов.