我正在处理一些大型数据集,其中复杂矩阵的实部和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
有什么建议吗?
答案 0 :(得分:2)
无论如何都需要复制数据,因为期望MatrixXcd
是交错的实/复杂项。尽管如此,您可以通过以下方式避免使用昂贵的复杂产品:
MatrixXcd data(nrow,ncol);
data.real() = buf.leftCols(ncol);
data.imag() = buf.rightCols(ncol);
还要确保在编译器优化为ON的情况下进行基准测试,初始版本的22s似乎太多了。