从特征数组/矩阵的行中填充 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<Eigen::Array<double, 2, -1, 0, 2, -1>, 1, -1, false>" has no member "begin"
。
好的,你能分享那个代码吗?知道没有发生什么太奇怪的事情会有所帮助。
【参考方案1】:
想通了。问题与storage order 有关,即 Eigen 如何在内存中布置二维数组的方式。有两种可能的布局:RowMajor
和 ColumnMajor
。默认布局是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的主要内容,如果未能解决你的问题,请参考以下文章