我正在从源获取原始缓冲流。
unsigned char *data = ...; // of know length
我想将其映射到 MyMapMatrixXci 中。
typedef Eigen::Matrix<std::complex<uint16_t>, Eigen::Dynamic, Eigen::Dynamic>
MyMatrixXci;
typedef Eigen::Map<MyMatrixXci> MyMapMatrixXci;
我正在努力寻找正确的步骤来映射它。
如果我的数据类型已经与地图相匹配,我就可以开始工作了。下面的例子...
std::complex<uint16_t> *data = new std::complex<uint16_t>[rows * cols];
for (int i = 0; i < rows * cols; ++i) {
data[i] = {i, i};
}
Eigen::Map<MyMatrixXci, Eigen::RowMajor> mat(&data[0], rows, cols);
std::cout << mat << std::endl;
我挣扎的地方是将“unsigned char *data”缓冲区重新解释为“std::complex
(我可以得到一个原始缓冲区到非复杂矩阵映射的映射来工作。似乎复杂方面的添加正在为直接映射引入问题。这个页面很棒但没有针对我的特定示例问题。https://eigen.tuxfamily.org/dox-devel/group__TutorialMapClass.html)
好吧,就像我发布问题一样,我尝试了一个有效的新选项。好奇是否有更好的解决方案......
// my types
typedef Eigen::Matrix<std::complex<uint16_t>, Eigen::Dynamic, Eigen::Dynamic>
MyMatrixXci;
typedef Eigen::Map<MyMatrixXci> MyMapMatrixXci;
// some consts
const size_t rows = 3;
const size_t cols = 4;
// fake some raw data. (2 below is for complex real,imag)
uint8_t *raw = new uint8_t[rows * cols * sizeof(uint16_t) * 2];
for (size_t i = 0; i < rows * cols * 2; ++i) {
raw[i * 2] = i;
}
// answer
std::complex<uint16_t> *data =
reinterpret_cast<std::complex<uint16_t> *>(raw);
MyMapMatrixXci mat(data, rows, cols);
// Verify answer
std::cout << mat << std::endl;
这似乎符合我的预期答案......
(0,1) (6,7) (12,13) (18,19)
(2,3) (8,9) (14,15) (20,21)
(4,5) (10,11) (16,17) (22,23)