2016-08-03 38 views
6

我想了解表達式模板在Eigen中是如何工作的。 我理解,兩個動力雙載體的總和的東西,看起來像這樣進行的:Eigen中的表達式模板

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

我也充分理解兩個向量的差異是如何實現的。

我有兩個問題。

1.通過標量工作,矢量的乘積是怎樣的?

我注意到,

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

存在,但我有一種感覺,它只是設計用於兩個向量的分量地執行操作。這是否意味着由標量的向量的產品對應一元運算符,說

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

2.可模板表達式從混合運算建?

例如,在像

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

的表達,這是真的,這些操作是在這樣的嵌套方式執行?

  • v-w導致E1的一個實例的製作
  • 2*v導致E2
  • 2*v + (v-w)的一個實例的結構導致E3
  • u + (2*v + (u-w))的一個實例的結構導致建設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.產品如何一個向量的標量工作?

在特徵3.2中,它被實現爲一元運算符,函子存儲標量因子的值。在本徵3.3,它現在被實現爲給定的矩陣表達式和一個常量表達式之間的二進制運算符,是這樣的:的返回類型

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

這種方法允許以清楚地s*vecvec*s之間區分,並且,例如,vec*s相當於vec*VectorxD::Constant(vec.size(),s)之一。

2.模板表達式是否可以通過混合操作構建?

你的理解是正確的:首先表達E1至E4的創建,然後評估與過載operator=開始產生類似代碼:

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

非常感謝您的回答! – Aleph