【问题标题】:Convert vector of dynamic Eigen vectors to bytes将动态特征向量的向量转换为字节
【发布时间】:2019-06-21 03:24:39
【问题描述】:

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

【问题讨论】:

    标签: c++ eigen eigen3


    【解决方案1】:

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

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

    【讨论】:

    • 如果vectors 的条目大小不同,reserve 将是次优的。当然,bytes 的内容不足以从它重新创建相同的vectors(您需要有关各个尺寸的更多信息)。
    • @chtz 你是对的!这仅适用于我的情况,因为所有特征向量都具有相同的大小。我认为这个问题没有通用的解决方案,因为您必须保存有关每个特征向量长度的额外数据
    猜你喜欢
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多