我有一个将静态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
向量转换为字节向量?
发布于 2019-06-21 03:24:40
好的,有一个非常明显的解决方案:
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;
}
https://stackoverflow.com/questions/56692437
复制相似问题