我在进行一些科学编程,并使用了Boost.Units和Eigen 2,都取得了很好的效果。
Boost.Units可以为量提供编译时的量纲分析(即标记带单位的量并通过经典物理量纲分析来捕获许多错误),而我在线性代数方面则使用Eigen 2。
然而,Eigen没有单位的概念。虽然你可以在矩阵中设置标量量,并将两个量相乘,但它期望相乘后的类型保持不变,而这显然对于单位是不正确的。例如,以下代码:
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和模板特化也是可能的。