2016-08-03 5 views
6

式テンプレートがEigenでどのように機能するかを理解したいと思います。 私は2つの力学のダブルベクトルの和は、このようなものによって実行されていることがわかる:私はまた、2つのベクトルの違いがどのように実装されるか理解Eigenの式テンプレート

CwiseBinaryOp< internal::scalar_sum_op<double>, VectorXd const, VectorXd const > operator+(VectorXd const & lhs, VectorXd const & rhs); 

私には2つの質問があります。

1.スカラー演算によるベクトルの積はどのようになりますか?

私は

CwiseBinaryOp< internal::scalar_product_op<double>, VectorXd const, VectorXd const > 

が存在するが、私は唯一の2つのベクトル間の要素ごとの操作を実行するように設計されていることを感じを持っていることに気づきました。それは、スカラー、ベクトルの積は、単項演算子に対応

CwiseUnaryOp< internal::scalar_product_op<double>, VectorXd const, VectorXd const > ? 

2.式が混在運用から構築されたテンプレートことができると言うことを意味するのでしょうか?例えば

は、

x = u + (2*v + (v-w)) 

のような式では、これらの動作は、このようなネストされた方法で実行されていることは事実ですか?

  • v-w建設へのE3
  • u + (2*v + (u-w))リードのインスタンスの構築につながるE2
  • 2*v + (v-w)のインスタンスの構築につながるE1
  • 2*vのインスタンスの構築につながりますE4のインスタンスの例
  • x = u + (2*v + (v-w))コール

コンストラクタ

VectorXd(E4 const &); 

または以下の別名で、前のステップから構築されたツリーを評価し

VectorXd & operator=(E4 const &); 

をオーバーロード:

using diff = internal::scalar_difference_op<double>; 
using prod = internal::scalar_product_op<double>; 
using sum = internal::scalar_sum_op<double>; 

using E1 = CwiseBinaryOp< diff, VectorXd const, VectorXd const >; 
using E2 = CwiseUnaryOp< prod, VectorXd const >; 
using E3 = CwiseBinaryOp< sum, E1 const, E2 const >; 

答えて

6

1.どの製品を行いますスカラーの仕事によってベクトルの?

Eigen 3.2では、単項演算子として実装され、ファンクタの値が格納されます。例えば

CwiseBinaryOp<scalar_product_op<double,double>, 
       VectorXd, 
       CwiseNullaryOp<scalar_constant_op<double>, VectorXd> > 

このアプローチは、許可が明確s*vecvec*sを区別するために、及びの戻り型:固有3.3においては、今与えられた行列式と定数式の間の二項演算子のようなものとして実装されていますvec*svec*VectorxD::Constant(vec.size(),s)の1つに相当します。

2.テンプレート式を複数の操作から作成できますか?

あなたの理解は正しいです:最初のE4に表現E1が作成され、その後、評価は次のようなコード生成過負荷にoperator=から始まる:

for(i=0;i<x.size();++i) 
    x[i] = E4.coeff(i); 
+0

あなたの答えをありがとうございました! – Aleph

関連する問題