将线性代数库与Boost :: Units组合在一起

thi*_*ton 12 c++ boost linear-algebra eigen boost-units

我正在进行大量的科学编程,并使用Boost.Units提供了非常好的经验,它提供了数量的编译时尺寸分析(即带有单位的标签数量,从而通过经典物理尺寸分析捕获了许多误差)并使用了Eigen 2代表线性代数.

然而,Eigen没有单位的概念,虽然你可以在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();
Run Code Online (Sandbox Code Playgroud)

不起作用,即使它在逻辑上是正确的.

有没有支持单位的矩阵库?我知道这在过去很难实现,而且C++ 11 decltype会更容易实现,但是C++ 03和模板专业化肯定是可能的.

小智 7

我相信Blitz ++支持很多Boost.Units功能.

由OP编辑:这里参考的是完整的测试代码,我用它测试了Blitz矩阵乘法功能:

#include <blitz/array.h>
#include <boost/units/systems/si/area.hpp>
#include <boost/units/systems/si/length.hpp>
#include <boost/units/quantity.hpp>

using boost::units::quantity;
namespace si = boost::units::si;

namespace blitz {
template< typename U1, typename T1, typename U2, typename T2>
struct Multiply< quantity<U1,T1>, quantity<U2,T2> >
{
    typedef typename boost::units::multiply_typeof_helper< quantity<U1,T1>, quantity<U2,T2> >::type T_numtype;

    static inline T_numtype apply( quantity<U1,T1> a, quantity<U2,T2> b ) { return a*b; }
};

}

using namespace blitz;

int main() {
    Array< quantity<si::length>, 1 > matrix;
    Array< quantity<si::area>, 1 > area;
    area = matrix * matrix;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)