我想了解表达式模板如何在 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.向量与标量的乘积如何工作?
在 Eigen 3.2 中,它被实现为一元运算符,具有存储标量因子值的仿函数。在 Eigen 3.3 中,它现在被实现为给定矩阵表达式和常量表达式之间的二元运算符,例如:
CwiseBinaryOp<scalar_product_op<double,double>,
VectorXd,
CwiseNullaryOp<scalar_constant_op<double>, VectorXd> >
这种方法允许清楚地区分
s*vec
和 vec*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);
关于eigen - Eigen 中的表达式模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38749492/