将 Eigen 数组行保存在变量中

Save Eigen array row in a variable

我正在尝试从 Eigen::ArrayXXi 中提取第 j 行并将其存储在一个变量中。这是我试过的。

Eigen::Array<int, arr.rows(), arr.cols()> row = arr.row(j);

但是我得到以下突出显示的错误 arr.rows()

Non-type template argument of type 'Eigen::Index' (aka 'long') is not an integral constant expression

我找不到 arr.row() 的 return 类型。根据文档,它是 RowExpr,这对我来说毫无意义。

您不能使用

Eigen::Array<int, arr.rows(), arr.cols()> row = arr.row(j);

因为 rows()cols() 不是 constexpr,因此它们不是错误消息中所写的常量表达式:https://eigen.tuxfamily.org/dox/structEigen_1_1EigenBase.html#ab75c2d8a783d055db397319c5a330eee .

您有两个选择,如果大小在编译时已知,则对值进行硬编码,否则,如本教程中所述https://eigen.tuxfamily.org/dox/group__TutorialArrayClass.html 使用:

Eigen::Array<int, Dynamic, Dynamic> row = arr.row(j);

具有动态尺寸。有关使用动态大小的更多信息,请参阅 Matrix 的文档,该文档引用自 Array 的文档:https://eigen.tuxfamily.org/dox/classEigen_1_1Matrix.html

我可以看到 Eigen::Array<int, Dynamic, Dynamic> 的别名是 ArrayXXihttps://eigen.tuxfamily.org/dox/group__arraytypedefs.html#gab2c3a894f02fb9fdbc3de996c9d02312

Edit 正如用户 ggael 所指出的,如果我们至少知道一个维度,也可以使用 ArrayXi,即 1。

如果你想要它的副本,那么你可以在一维数组中分配它:

ArrayXi arr_j = arr.row(j);

如果您想保留一行是 1xN 的事实,那么:

Array<int,1,Dynamic> arr_j = arr.row(j);

或(等价地):

auto arr_j = arr.row(j).eval();

最后,如果你想引用原始数据,那么:

auto arr_j = arr.row(j);

或(等价地):

ArrayXXi::RowExpr arr_j = arr.row(j);