Eigen::Map::复数矩阵的原始缓冲区

问题描述 投票:0回答:1

我正在从源获取原始缓冲流。

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)

c++ eigen
1个回答
0
投票

好吧,就像我发布问题一样,我尝试了一个有效的新选项。好奇是否有更好的解决方案......

 // 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)
© www.soinside.com 2019 - 2024. All rights reserved.