我正在处理一些大型数据集,其中复杂矩阵的实部和imag部分分别存储在文件中,我想根据此类数据创建Eigen::MatrixXcd:

   // read data, note that real and imag data are stored separately
   // and the file reader API only allow read them in continuous fashion.
   MatrixXd buf(nrow, ncol * 2);
   get_realpart_from_file(buf.data(), nrow * ncol);
   get_imagpart_from_file(buf.data() + nrow * ncol, nrow * ncol);
   // the above takes about 4 sec for a ~2 GB data block.
   // now we have buf contains [<real data> ... <imag data>]
   // but we would like access the data as complex matrix
   ???? what to do there?

天真的方法是像下面这样复制数据:
   MatrixXd data;
   data = buf.block(0, 0, nrow, ncol) + buf.block(0, ncol, nrow, ncol) * std::complex<double>(0, 1);

但这2GB的数据块花了22秒。

我想知道是否有更聪明的方法可以做到这一点,类似于:
   Map<MatrixXcd, {some magic}> data(buf.data(), {some magic});
   // use data like a complex matrix

有什么建议么?

最佳答案

无论如何都需要复制数据,因为预期MatrixXcd是交错的实/复杂项。但是,您可以通过以下方式避免使用昂贵的复杂产品:

MatrixXcd data(nrow,ncol);
data.real() = buf.leftCols(ncol);
data.imag() = buf.rightCols(ncol);

另外,请确保以编译器优化功能为基准进行测试,初始版本的22s似乎太多了。

关于c++ - Eigen :将real和imag MatrixXd映射到MatrixXcd,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56927720/

10-12 23:59