【问题标题】:C++: compare Eigen::ArrayXd and Eigen::ArrayXXd -- when is automatic casting valid?C++:比较 Eigen::ArrayXd 和 Eigen::ArrayXXd -- 自动转换何时有效?
【发布时间】:2018-08-02 12:57:30
【问题描述】:

问题: 何时将二维数组 (Eigen::ArrayXXd) 的 {to or from} {行或列} {to or from} 一维数组 (Eigen::ArrayXd) {to or from} 有效?

背景: 我正在使用使用二维数组 (Eigen::ArrayXXd) 来存储一组数据的代码。然后,我有几个函数可以对该数据的单个列或行进行操作。如果我让所有这些函数都将 Eigen::ArrayXXd 作为输入和输出类型,那么它们可以自动处理数据集的行或列。话虽如此,这些函数都只对一维数字集起作用。他们不需要知道特定的一维数据集来自二维数组。如果我可以将一维数组用于函数的输入和输出,它将简化输入验证和文档。

【问题讨论】:

    标签: c++ arrays casting eigen eigen3


    【解决方案1】:

    看起来您可以使用 1D 数组对 2D 数组的行列进行赋值,至少对于下面显示的几个简单情况。我不确定是否还有其他情况会失败。

    #include <Eigen/Dense>
    #include <iostream>
    
    Eigen::ArrayXXd fun_2d_d2(Eigen::ArrayXXd data, double scale) { return data * scale; }
    Eigen::ArrayXd fun_1d_1d(Eigen::ArrayXd data, double scale) { return data * scale; }
    Eigen::ArrayXXd fun_2d_d2_cst(const Eigen::ArrayXXd& data, double val) { return data + val; }
    Eigen::ArrayXd fun_1d_1d_cst(const Eigen::ArrayXd& data, double val) { return data + val; }
    
    int main(int argc, char** argv)
    {
      // Create the data:
      int nRow = 5; int nCol = 8;
      Eigen::ArrayXXd data = Eigen::ArrayXXd::Constant(nRow, nCol, 1.0);
    
      // Call functions with pass by value:
      data.row(1) = fun_2d_d2(data.row(1), 3.0);
      data.row(3) = fun_1d_1d(data.row(3), 4.0);
      data.col(2) = fun_1d_1d(data.col(2), 5.0);
    
      // Call  functions with pass by constant reference:
      data.row(4) = fun_2d_d2_cst(data.row(4), 3.0);
      data.row(4) = fun_1d_1d_cst(data.row(3), 4.0);
      data.col(5) = fun_1d_1d_cst(data.col(2), 5.0);
    
      // Print the result:
      std::cout << data << std::endl;
      return 0;
    }
    

    此代码打印以下输出:

     1  1  5  1  1 10  1  1
     3  3 15  3  3 20  3  3
     1  1  5  1  1 10  1  1
     4  4 20  4  4 25  4  4
     8  8 24  8  8 29  8  8
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多