从特征数组/矩阵的一行中填充 std::vector
Fill a std::vector from a row of an Eigen Array / Matrix
我有一个 Eigen Array2Xd
,我想将它的每一行放入 std::vector<double>
。
spline_knots
是一个大小为 (2, 4) 的 Array2Xd,具有以下值:
Array2Xd spline_knots(2, 4);
spline_knots << -1, 0, 30.57, 60.83,
0, 0, 9.73, 15.44;
我根据this answer尝试了以下方法:
vector<double> knot_xs(spline_knots.row(0).data(),
spline_knots.row(0).data() + spline_knots.row(0).size());
vector<double> knot_ys(spline_knots.row(1).data(),
spline_knots.row(1).data() + spline_knots.row(1).size());
但是,尝试使用上述代码将每一行复制到一个向量中时,我得到了以下结果,这很奇怪(第一行以正确的元素开头,然后是零;第二行只有零,以第三行结尾第一行的元素):
kont_xs: -1 0 0 0
knot_ys: 0 0 0 30.57
这里有什么问题,如何从二维数组的一行 不使用循环 创建向量?
想通了。问题与 storage order 有关,Eigen 在内存中布置二维数组的方式。有两种可能的布局:RowMajor
和 ColumnMajor
。默认布局是 ColumnMajor
,它按列存储二维数组元素。
知道了这一点,我得到的奇怪结果就很有意义了。 .row(0).data()
returns 指向第一行第一个元素的指针。 .row(0).size()
是 4,.row(0).data() + 4
按列取前 4 个元素:[-1, 0, 0, 0]
。第二列的相同参数从 (1, 0) 元素开始,按列计算 4 个元素导致 [0, 0, 0, 30.57]
。
有两种解决方案:
- 使 Array/Matrix 布局 行优先 :
Array<double, 2, Dynamic, RowMajor> arr(2, 6);
arr << 1, 2, 3, 4
5, 6, 7, 8;
vector<double> row1_vec(arr.row(0).data(), arr.row(0).data() + arr.cols());
// row1_vec: 1, 2, 3, 4
- 或使用 Eigen 的 Map class:
Array2Xd arr(2, 4);
arr << 1, 2, 3, 4,
5, 6, 7, 8;
vector<double> row1_vec(arr.cols());
Map<RowVectorXd>(&row1_vec[0], 1, arr.cols()) = arr.row(0);
// row1_vec: 1, 2, 3, 4
我有一个 Eigen Array2Xd
,我想将它的每一行放入 std::vector<double>
。
spline_knots
是一个大小为 (2, 4) 的 Array2Xd,具有以下值:
Array2Xd spline_knots(2, 4);
spline_knots << -1, 0, 30.57, 60.83,
0, 0, 9.73, 15.44;
我根据this answer尝试了以下方法:
vector<double> knot_xs(spline_knots.row(0).data(),
spline_knots.row(0).data() + spline_knots.row(0).size());
vector<double> knot_ys(spline_knots.row(1).data(),
spline_knots.row(1).data() + spline_knots.row(1).size());
但是,尝试使用上述代码将每一行复制到一个向量中时,我得到了以下结果,这很奇怪(第一行以正确的元素开头,然后是零;第二行只有零,以第三行结尾第一行的元素):
kont_xs: -1 0 0 0
knot_ys: 0 0 0 30.57
这里有什么问题,如何从二维数组的一行 不使用循环 创建向量?
想通了。问题与 storage order 有关,Eigen 在内存中布置二维数组的方式。有两种可能的布局:RowMajor
和 ColumnMajor
。默认布局是 ColumnMajor
,它按列存储二维数组元素。
知道了这一点,我得到的奇怪结果就很有意义了。 .row(0).data()
returns 指向第一行第一个元素的指针。 .row(0).size()
是 4,.row(0).data() + 4
按列取前 4 个元素:[-1, 0, 0, 0]
。第二列的相同参数从 (1, 0) 元素开始,按列计算 4 个元素导致 [0, 0, 0, 30.57]
。
有两种解决方案:
- 使 Array/Matrix 布局 行优先 :
Array<double, 2, Dynamic, RowMajor> arr(2, 6);
arr << 1, 2, 3, 4
5, 6, 7, 8;
vector<double> row1_vec(arr.row(0).data(), arr.row(0).data() + arr.cols());
// row1_vec: 1, 2, 3, 4
- 或使用 Eigen 的 Map class:
Array2Xd arr(2, 4);
arr << 1, 2, 3, 4,
5, 6, 7, 8;
vector<double> row1_vec(arr.cols());
Map<RowVectorXd>(&row1_vec[0], 1, arr.cols()) = arr.row(0);
// row1_vec: 1, 2, 3, 4