我想了解表达模板在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 >;
答案 0 :(得分:6)
<强> 1。标量的矢量乘积如何工作?
在Eigen 3.2中,它实现为一元运算符,带有存储标量因子值的仿函数。在Eigen 3.3中,它现在被实现为给定矩阵表达式和常量表达式之间的二元运算符,如:
s*vec
此方法允许明确区分vec*s
和vec*s
,并且返回类型(例如vec*VectorxD::Constant(vec.size(),s)
)等同于operator=
。
<强> 2。模板表达式可以通过混合操作构建吗?
您的理解是正确的:首先创建表达式E1到E4,然后从重载的for(i=0;i<x.size();++i)
x[i] = E4.coeff(i);
开始评估,生成如下代码:
ViewStub