14

我正在做大量的科学编程,并在 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();

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

有没有支持单位的矩阵库?我知道这在过去是出了名的难以实现,而 C++11decltype将使这变得更容易,但使用 C++03 和模板专业化肯定是可能的。

4

4 回答 4

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;
}
于 2011-11-14T18:12:46.620 回答
1

你应该检查这个 Wiki 页面: http ://eigen.tuxfamily.org/dox-devel/TopicCustomizingEigen.html

Eigen 需要做一些工作才能使用原始数据类型以外的东西,但通常是可以的。

于 2011-11-14T11:43:40.080 回答
0

使用标准 Eigen 库插件选项的困难在于,需要替换现有的运算符 +、-、* 等以使用 Boost Units 数量。

例如,要让 Boost 单元自定义类型与 * 乘法运算符一起使用,对于任意 CUSTOM_TYPE,它需要如下所示:

template<class X,class Y>
CUSTOM_TYPE<typename boost::units::multiply_typeof_helper<X,Y>::type>
operator*(const CUSTOM_TYPE<X>& x,const CUSTOM_TYPE<Y>& y)
{
    typedef typename boost::units::multiply_typeof_helper<X,Y>::type    type;

    return CUSTOM_TYPE<type>( ... );
}

请注意返回类型与输入类型的不同之处。在这里,您使用模板助手 multiply_typeof_helper 创建返回类型。这是因为将米乘以秒不会给您任何单位的数量。但是,默认的 Eigen * 运算符将返回与输入相同的“类型”——这就是问题所在。

另一种选择是将特征矩阵嵌入数量内,而不是将数量嵌入矩阵内。

于 2016-05-28T01:49:20.777 回答
0

具有统一单位的向量/矩阵的简单情况可以通过调整特征矩阵的值类型来部分解决,但这需要大量的用户干预以专门化特征的形式,甚至这对于所有操作来说都不够。

但是,如果您想解决包含非统一单位的矩阵的一般情况(即每个条目可以有 affigeren 单位),那么这将无法通过自定义矩阵的值类型来实现。

您需要一种类似于此处介绍的方法,该方法位于线性代数库之上并提供单位注释:https ://m.youtube.com/watch?v=4LmMwhM8ODI

于 2022-01-30T10:18:03.067 回答