2017-07-02 16 views
0

Eigen::MatrixXdEigen::VectorXdをベクトルと行列で置き換える最も簡単な方法は、long doubleの要素ですか?Eigen :: MatrixXd typedefの置換

コード内のすべての基本浮動小数点変数は、タイプlong doubleです。また、私は行列やベクトルを使うたびに、次のtypedefを使います。

typedef Eigen::VectorXd Vec; 
typedef Eigen::MatrixXd Mat; 

これらのtypedefをどのように切り替えるのが最適ですか?もし私がそれらをそのまま残すとどうなりますか?

+0

もっと重要な質問は本当に 'long double'が必要ですか?たいていのプロセッサは 'double'算術を高速に実行できるように構築されているため、計算が大幅に遅くなる可能性があります。また、コンパイラが 'long double'を無視し、' double'を代わりに使用するかもしれません。 [Wikipediaの記事](https://en.wikipedia.org/wiki/Long_double)を読んで、もう一度考えてみてください。ありがとう。 –

答えて

2

Eigenのglobal matrix typedefsに基づいて、独自のtypedefを定義するだけです。

あなたがEigen::MatrixXdを使用して、タイプlong doubleの要素とそれを埋める場合は、これらの値は、精度の損失や、最悪の場合には、オーバーフローエラーになり行列のdouble要素に収まるように狭められます。しかし、多くのアーキテクチャでは、倍精度浮動小数点演算は80ビットの拡張精度で行われるため、結果は同じになる可能性があります。あなたは確かにこれに頼るべきではありません!詳細は、例えばlong double vs doubleをご覧ください。

#include <Eigen/Core> 

typedef Eigen::Matrix< long double, Eigen::Dynamic, 1    > Vec; 
typedef Eigen::Matrix< long double, Eigen::Dynamic, Eigen::Dynamic > Mat; 

int main() 
{ 
    long double ld = 2; 

    Mat m(1,1); 
    m(0,0) = ld; 
} 
+0

私はそのリンクを見て、最初のテンプレートパラメータとして 'long double'と' std :: complex 'の違いについて疑問を抱いていました。そして、私はその他のことを調べます – Taylor

関連する問題