У меня есть функция для преобразования статических 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
векторов в вектор байтов?