我正在将执行数值模拟的程序从 FORTRAN 翻译成 C++。
我必须处理 800MB 大小的两倍的大矩阵。 这个
double M[100][100][100][100];
给出段错误,因为堆栈不是那么大。 使用 new、delete 很尴尬,因为我需要四个 for 循环来分配我的数组甚至取消分配它。
std::array 在栈中所以不好。 std::vector 是个不错的选择,所以
第一个问题 std::vector 适合快速模拟还是
vector<vector<vector<vector<int,100>,100>,100>,100>
会携带大量无用且繁重的数据吗?
第二个问题 您知道我可以使用的其他数据结构吗?也许有一些来自 boost 的东西。
目前我只是使用这个解决方案:
double * M = new double [100000000];
我正在手动访问我需要的条目。 如果我找不到任何其他高效的解决方案,我将编写一个自动管理最后一个方法的类。
第三个问题您认为这会显着降低性能吗?
最佳答案
您可能需要考虑 std::valarray
,它旨在与 FORTRAN 竞争。它将元素存储为平面数组并支持数学运算,以及切片和间接访问的操作。
无论如何,这听起来像是您的计划。虽然即使是manpage建议可能有更灵活的选择。
关于用于 HPC 的 C++ std::vector?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39546874/