Eigen中的表达模板

时间:2016-08-03 16:52:32

标签: eigen eigen3

我想了解表达模板在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 >;

1 个答案:

答案 0 :(得分:6)

<强> 1。标量的矢量乘积如何工作?

在Eigen 3.2中,它实现为一元运算符,带有存储标量因子值的仿函数。在Eigen 3.3中,它现在被实现为给定矩阵表达式和常量表达式之间的二元运算符,如:

s*vec

此方法允许明确区​​分vec*svec*s,并且返回类型(例如vec*VectorxD::Constant(vec.size(),s))等同于operator=

<强> 2。模板表达式可以通过混合操作构建吗?

您的理解是正确的:首先创建表达式E1到E4,然后从重载的for(i=0;i<x.size();++i) x[i] = E4.coeff(i); 开始评估,生成如下代码:

ViewStub