C ++:比较Eigen :: ArrayXd和Eigen :: ArrayXXd - 何时自动转换有效?

时间:2018-02-22 15:40:03

标签: c++ arrays casting eigen eigen3

问题: 什么时候将一个二维数组(Eigen :: ArrayXXd)的{row或column}分配给{或从}一个数组(Eigen :: ArrayXd)?

背景 我正在使用使用2D数组(Eigen :: ArrayXXd)来存储一组数据的代码。然后,我有几个函数在该数据的单个列或行上运行。如果我将所有这些函数作为其输入和输出类型,那么它们可以自动使用数据集的行或列。话虽这么说,这些功能都只能在一组数字上运行。他们不需要知道特定的1D数据集来自2D阵列。如果我可以使用1D数组作为函数的输入和输出,它将简化输入验证和文档。

1 个答案:

答案 0 :(得分:0)

看起来你可以使用一维数组来分配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