将动态特征向量的向量转换为字节

Convert vector of dynamic Eigen vectors to bytes

我有一个函数可以将静态 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 向量的向量转换为字节向量?

好的,有一个非常明显的解决方案:

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;
}