如何为特征矩阵创建 STL 输出迭代器?

Posted

技术标签:

【中文标题】如何为特征矩阵创建 STL 输出迭代器?【英文标题】:How to create an STL output iterator for a Eigen matrix? 【发布时间】:2019-04-23 08:52:59 【问题描述】:

假设你有一个Eigen::Matrix<float, Eigen::Dynamic, 3> m;。现在您有 Eigen 之外的数据,并希望使用 STL 算法(例如 std::transform)将其移动到您的矩阵中。 documentation 给出了如何在基于范围的 for 循环中使用 m.rowwise() 的示例。但是,将m.rowwise() 作为std::transform 的输出迭代器传递是行不通的。它抱怨VectorwiseOp 没有operator++。基于范围的 for 循环无论如何都会调用范围表达式的 begin() 方法,但 VectorwiseOp does not have 是 begin() 方法。

假设我有一个std::vector<std::tuple<float, float, float>> i;。我将如何将其转换为矩阵?当然,在这里可以对索引变量使用普通循环,但是当使用更复杂的输入数据结构时,这会变得很困难。然后,可以使用std::for_each 并在外部维护输出索引,但这似乎很笨拙。我正在寻找类似的东西

std::transform(
    i.cbegin(),
    i.cend(),
    /* TODO: something like m.rowwise() */,
    [](const std::tuple<float, float, float> &e) -> /* TODO */ 
        /* don't care here */
    );

【问题讨论】:

【参考方案1】:

Eigen::VectorwiseOp&lt;ET, D&gt; 在 Eigen 3.4 中获得了适当的 beginend,您正在查看 3.3 的源代码。

如果升级到 3.4,那就简单了

std::transform(
    i.cbegin(),
    i.cend(),
    m.rowwise().begin(),
    [](const std::tuple<float, float, float> &e) -> decltype(*m.rowwise().begin()) 
        /* don't care here */
    );

【讨论】:

我注意到主页目前显示“最新的稳定版本是 Eigen 3.3.7。”

以上是关于如何为特征矩阵创建 STL 输出迭代器?的主要内容,如果未能解决你的问题,请参考以下文章

STL 笔记 迭代器 iterator

如何为一长串整数创建优化的迭代器?

STL迭代器相关的输出迭代器

如何从 STL 类“继承”迭代器?

我正在尝试使用 c++ STL 制作 prims 算法。在迭代器第一次迭代后,它会停止代码并给出错误的输出

如何为迭代器返回“null”值?