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

C++ 将动态特征向量的向量转换为字节,c++,eigen,eigen3,C++,Eigen,Eigen3,我有一个将静态特征向量转换为字节向量的函数: 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_

我有一个将静态
特征向量转换为字节向量的函数:

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
}
然而,这会产生一个比预期大四倍的向量,所以我想动态向量不能像静态向量那样简单地转换为字节。我可以这样解决尺寸问题:

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
}
模板
静态std::向量toBytes(std::向量常量和向量)
{
std::向量字节;
uint8_t const*rawData=重新解释强制转换(vectors.data());
bytes.insert(bytes.end(),rawData,rawData+vectors.size()*vectors[0].size()*sizeof(T));
返回字节
}

这将导致使用值填充正确长度的向量,但这些值不正确。如何将动态
特征向量
向量转换为字节向量?

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

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;
}
模板
静态std::vector createBuffer(std::vector const&vectors)
{
std::vector&bytes=buffer.bytes;
bytes.reserve(vectors.size()*vectors[0].size()*sizeof(T));
用于(自动常量和向量:向量)
{
对于(int i=0;i
好的,有一个非常明显的解决方案:

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;
}
模板
静态std::vector createBuffer(std::vector const&vectors)
{
std::vector&bytes=buffer.bytes;
bytes.reserve(vectors.size()*vectors[0].size()*sizeof(T));
用于(自动常量和向量:向量)
{
对于(int i=0;i
如果
向量
的条目大小不同,则
保留
将是次优的。当然,
字节
的内容不足以从中重新创建相同的
向量
(您需要有关单个大小的附加信息)。@chtz您是正确的!这只适用于我的情况,因为所有特征向量都具有相同的大小。我不认为这个问题有一个通用的解决方案,因为你必须保存关于每个特征向量长度的额外数据。如果
向量的条目大小不同,
保留
将是次优的。当然,
字节
的内容不足以从中重新创建相同的
向量
(您需要有关单个大小的附加信息)。@chtz您是正确的!这只适用于我的情况,因为所有特征向量都具有相同的大小。我不认为这个问题有一个通用的解决方案,因为你必须保存关于每个特征向量长度的额外数据