14

私はかなりの量の科学的プログラミングを行っており、Boost.Unitsの両方で非常に良い経験をしました。これは、数量のコンパイル時の次元分析を提供します(つまり、数量に単位をタグ付けして、従来の物理的次元分析で多くのエラーをキャッチします)。線形代数の場合は2。

ただし、Eigenには単位の概念がなく、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とテンプレートの特殊化で確実に可能になりました。

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ユニットのカスタムタイプが* multiply演算子で機能する場合、任意の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 *演算子は、入力と同じ「タイプ」を返します。これが問題です。

もう1つのオプションは、行列内に数量を埋め込むのではなく、数量内に固有行列を埋め込むことです。

于 2016-05-28T01:49:20.777 に答える
0

均一な単位を持つベクトル/行列の単純なケースは、固有行列の値型を調整することで部分的に解決できますが、これには特殊な特性の形でかなりのユーザー介入が必要であり、これでもすべての操作に十分ではありません。

ただし、不均一な単位を含む行列の一般的なケースを解決したい場合(つまり、各エントリにaffigeren単位を含めることができる場合)、行列の値の型をカスタマイズしても、これは機能しません。

線形代数ライブラリの上にレイヤーを配置し、ユニットの注釈を提供する、ここに示すようなアプローチが必要です:https ://m.youtube.com/watch?v=4LmMwhM8ODI

于 2022-01-30T10:18:03.067 に答える