Eigen 3.3.x: 如何对所有行进行lamba操作?
Eigen 3.3.x: How to lamba-operate across all rows?
假设我有以下循环:
struct Obj {
RowVectorXf payload;
Obj(RowvectorXf payload) : payload(std::move(payload)) {};
}
MatrixXd data = ...
std::vector<Obj> payloads;
for (int i = 0; i < n; i++) {
payloads.emplace_back(data.row(i)(seq(1,10,2));
}
这是对我的用例的简化,它绝对需要进入 std::
space 并带有一个包含切片的 struct
以确保完整性和易于编码。无论如何,我已经开始放弃使用 unaryExpr
,我很好奇是否有类似 rowExpr
的东西可以在没有 for 循环的情况下执行此功能(从而消除视觉噪音)。
// Goal, in pseudo code:
data.rowExpr([](RowVectorXd row) payloads.emplace_back(row(seq(1,10,2));
通过 Eigen 的开发分支(以及即将发布的 3.4 版本),您可以使用 std
兼容的迭代器访问 Eigen 对象的元素。要逐行迭代 Eigen 表达式,您需要编写 data.rowwise().begin()
和 data.rowwise().end()
——(要逐列迭代,您当然需要编写 .colwise().begin()
)。您可以直接将这些传递给 std::vector
的构造函数(如果类型兼容)。
由于在您的示例中您还需要在 double
和 float
之间进行转换,因此您可以这样写:
auto const& data_ = data.cast<float>().rowwise();
std::vector<Obj> payloads(data_.begin(), data_.end());
完整的工作示例:https://godbolt.org/z/2x2jFJ
假设我有以下循环:
struct Obj {
RowVectorXf payload;
Obj(RowvectorXf payload) : payload(std::move(payload)) {};
}
MatrixXd data = ...
std::vector<Obj> payloads;
for (int i = 0; i < n; i++) {
payloads.emplace_back(data.row(i)(seq(1,10,2));
}
这是对我的用例的简化,它绝对需要进入 std::
space 并带有一个包含切片的 struct
以确保完整性和易于编码。无论如何,我已经开始放弃使用 unaryExpr
,我很好奇是否有类似 rowExpr
的东西可以在没有 for 循环的情况下执行此功能(从而消除视觉噪音)。
// Goal, in pseudo code:
data.rowExpr([](RowVectorXd row) payloads.emplace_back(row(seq(1,10,2));
通过 Eigen 的开发分支(以及即将发布的 3.4 版本),您可以使用 std
兼容的迭代器访问 Eigen 对象的元素。要逐行迭代 Eigen 表达式,您需要编写 data.rowwise().begin()
和 data.rowwise().end()
——(要逐列迭代,您当然需要编写 .colwise().begin()
)。您可以直接将这些传递给 std::vector
的构造函数(如果类型兼容)。
由于在您的示例中您还需要在 double
和 float
之间进行转换,因此您可以这样写:
auto const& data_ = data.cast<float>().rowwise();
std::vector<Obj> payloads(data_.begin(), data_.end());
完整的工作示例:https://godbolt.org/z/2x2jFJ