Eigen 3.3.x:如何在所有行上进行lamba操作?

问题描述 投票:0回答:1

假设我有以下循环:

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::进入struct空间,以保持理智并简化编码。无论如何,我已经开始放弃使用unaryExpr了,我很好奇是否有类似rowExpr的东西可以在没有for循环的情况下执行此功能(从而消除视觉噪声)。

// Goal, in pseudo code: 
data.rowExpr([](RowVectorXd row) payloads.emplace_back(row(seq(1,10,2));
c++ eigen eigen3
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.