gpt4 book ai didi

eigen - Eigen 中的表达式模板

转载 作者:行者123 更新时间:2023-12-04 14:56:16 27 4
gpt4 key购买 nike

我想了解表达式模板如何在 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/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com