[英]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;
我根據這個答案嘗試了以下方法:
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 數組的一行創建向量?
弄清楚了。 問題與 存儲順序有關,即 Eigen 如何在 memory 中布置二維數組的方式。 有兩種可能的布局: 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
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.