首页 > 解决方案 > 从特征数组/矩阵的行中填充 std::vector

问题描述

我有一个 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;

我根据这个答案尝试了以下方法:

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

这里有什么问题,如何在没有循环的情况下从 2D 数组的一行创建向量?

标签: c++eigen

解决方案


弄清楚了。问题与存储顺序有关,即 Eigen 如何在内存中布置二维数组的方式。有两种可能的布局:RowMajorColumnMajor. 默认布局是ColumnMajor,它按列存储二维数组元素。

知道了这一点,我得到的奇怪结果是有道理的。.row(0).data()返回指向第一行第一个元素的指针。是.row(0).size()4 并按.row(0).data() + 4列取前 4 个元素:[-1, 0, 0, 0]. 从 (1, 0) 元素开始的第二列的相同参数,并且按列计算 4 个元素导致[0, 0, 0, 30.57].

有两种解决方案:

  • 使 Array/Matrix 布局row-major
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

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

推荐阅读