मेरे पास स्थिर 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 वैक्टर के वेक्टर को बाइट्स के वेक्टर में कैसे परिवर्तित कर सकता हूं?

1
Jerome Reinländer 20 जून 2019, 22:08

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;
}
0
Jerome Reinländer 20 जून 2019, 19:24