【问题标题】: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