假设我有以下循环:
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));
通过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());