2016-08-03 29 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