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 的构造函数(如果类型兼容)。

由于在您的示例中您还需要在 doublefloat 之间进行转换,因此您可以这样写:

auto const& data_ = data.cast<float>().rowwise();
std::vector<Obj> payloads(data_.begin(), data_.end());

完整的工作示例:https://godbolt.org/z/2x2jFJ