从特征数组/矩阵的行中填充 std::vector

Posted

技术标签:

【中文标题】从特征数组/矩阵的行中填充 std::vector【英文标题】:Fill a std::vector from a row of an Eigen Array / Matrix 【发布时间】:2020-06-12 18:21:07 【问题描述】:

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

这里出了什么问题,如何从二维数组的一行中创建向量没有循环

【问题讨论】:

你试过循环版本,看看是否有效?您能否显示代码,让您知道spline_knots 实际上具有与向量中不同的值。 只要使用.row(0).begin().row(0).end()(需要Eigen的master分支) @cigien 是的,循环版本有效。如前所述,spline_knots 具有正确的值(我使用cout 打印它)。 @chtz 不幸的是,我的项目中似乎没有 Eigen 的主分支,我无法更改它。使用row(0).begin() 我得到错误class "Eigen::Block&lt;Eigen::Array&lt;double, 2, -1, 0, 2, -1&gt;, 1, -1, false&gt;" has no member "begin" 好的,你能分享那个代码吗?知道没有发生什么太奇怪的事情会有所帮助。 【参考方案1】:

想通了。问题与storage order 有关,即 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<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

【讨论】:

以上是关于从特征数组/矩阵的行中填充 std::vector的主要内容,如果未能解决你的问题,请参考以下文章

使用 std::vector 从数组中创建矩阵

来自 GCC 的未定义参考错误使用带有 std::vector 和特征矩阵的模板?

将行优先数组映射到列优先特征矩阵

在 omp 循环中填充已知大小的矩阵。条目大小未知

用于自动循环填充矩阵

大型数组、std::vector 和堆栈溢出