Преобразовать вектор динамических собственных векторов в байты - PullRequest
1 голос
/ 20 июня 2019

У меня есть функция для преобразования статических Eigen векторов в вектор байтов:

template<typename T, int N>
static std::vector<uint8_t> toBytes(std::vector<Eigen::Matrix<T, N, 1>> const & vectors)
{
    std::vector<uint8_t> bytes;
    uint8_t const * rawData = reinterpret_cast<uint8_t const *>(vectors.data());
    bytes.insert(bytes.end(), rawData, rawData + vectors.size() * N * sizeof(T));
    return bytes
}

Этого было достаточно, пока не обнаружились динамические Eigen векторы (т.е. Eigen::VectorXf), для которых N установлено на -1. Итак, я придумал это:

template<typename T>
static std::vector<uint8_t> toBytes(std::vector<Eigen::Matrix<T, -1, 1>> const & vectors)
{
    std::vector<uint8_t> bytes;
    uint8_t const * rawData = reinterpret_cast<uint8_t const *>(vectors.data());
    bytes.insert(bytes.end(), rawData, rawData + vectors.size() * sizeof(vectors[0]));
    return bytes
}

Это, однако, приводит к тому, что вектор в четыре раза больше ожидаемого, поэтому я предполагаю, что динамические векторы не могут быть тривиально преобразованы в байты как статический вектор. Я могу исправить проблему размера следующим образом:

template<typename T>
static std::vector<uint8_t> toBytes(std::vector<Eigen::Matrix<T, -1, 1>> const & vectors)
{
    std::vector<uint8_t> bytes;
    uint8_t const * rawData = reinterpret_cast<uint8_t const *>(vectors.data());
    bytes.insert(bytes.end(), rawData, rawData + vectors.size() *  vectors[0].size() * sizeof(T));
    return bytes
}

В результате получается вектор правильной длины, заполненный значениями, но эти значения не являются правильными. Как я могу преобразовать вектор динамических Eigen векторов в вектор байтов?

1 Ответ

0 голосов
/ 20 июня 2019

Хорошо, есть одно очень очевидное решение:

template<typename T>
static std::vector<uint8_t> createBuffer(std::vector<Eigen::Matrix<T, -1, 1>> const & vectors)
{
    std::vector<uint8_t> & bytes = buffer.bytes;
    bytes.reserve(vectors.size() * vectors[0].size() * sizeof(T));

    for (auto const & vector : vectors)
    {
        for (int i = 0; i < vector.size(); ++i)
        {
            uint8_t const * rawData = reinterpret_cast<uint8_t const *>(&vector(0));
            bytes.insert(bytes.end(), rawData, rawData + sizeof(T));
        }
    }

    return bytes;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...