Как создать выходной итератор STL для собственной матрицы? - PullRequest
3 голосов
/ 23 апреля 2019

Скажем, у вас есть Eigen::Matrix<float, Eigen::Dynamic, 3> m;. Теперь у вас есть данные вне Eigen и вы хотите переместить их в свою матрицу, используя алгоритм STL (например, std::transform). В документации приведены примеры использования m.rowwise() в цикле for, основанном на диапазоне. Однако передача m.rowwise() в качестве выходного итератора std::transform не работает. Он жалуется, что VectorwiseOp не имеет operator++. Цикл for, основанный на диапазоне, все равно вызовет метод begin() выражения диапазона, но VectorwiseOp не имеет a 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 Ответ

1 голос
/ 23 апреля 2019

Eigen::VectorwiseOp<ET, D> получает соответствующие begin и end в Eigen 3.4, вы искали источник для 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 */
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...