eigen - Eigen 中的表达式模板

标签 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.向量与标量的乘积如何工作?

    在 Eigen 3.2 中,它被实现为一元运算符,具有存储标量因子值的仿函数。在 Eigen 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);
    

    关于eigen - Eigen 中的表达式模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38749492/

    相关文章:

    c++ - Eigen : block 转置?

    c++ - 如何有效地组装 FEM 稀疏矩阵

    c++ - 固定大小的特征类型作为参数

    c++ - "+="操作在类型 std::complex<double> 和 __complex__ double 之间不起作用

    c++ - 在 visual studio 2012 中包含 Eigen 库

    c++ - Eigen slerp 导致读取访问冲突 (C++/OpenGL)

    c++ - 在 C++ 中评估多元正态/高斯密度

    c++ - 将 Eigen::PermutationMatrix.indices() 转换为数组/vector

    c++ - Ubuntu下Eigen3如何使用CholmodSupport

    c++ - 为什么 Eigen Matrix Library 的具有整数数据的固定大小类型不是 PoD?