我正在处理一些大型数据集,其中复杂矩阵的实部和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/