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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何为特征矩阵创建STL输出迭代器?相关的知识,希望对你有一定的参考价值。

说你有一个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 havebegin()方法。

说我有一个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 */
    });
答案

Eigen::VectorwiseOp<ET, D>在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 */
    });

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

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

STL 笔记 迭代器 iterator

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

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

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

STL之迭代器(iterator)