首页 > 解决方案 > 在 C++ 中对大型随机数组进行简单计算的内存使用更少

问题描述

对于一些分子动力学模拟,我创建了一些简单的 C++ 代码来创建粒子在 3D 空间中的随机分布:

double ** X = new double* [N]; 
    X[0] = new double[C];
    for(int i=0; i < C; i++)
        X[0][i] =  R_max  * (double)rand() / RAND_MAX;

double ** Y = new double* [N]; 
    Y[0] = new double[C];
    for(int i=0; i < C; i++)
        Y[0][i] =  R_max  * (double)rand() / RAND_MAX; 

double ** Z = new double* [N]; 
    Z[0] = new double[C];
    for(int i=0; i < C; i++)
        Z[0][i] =  R_max  * (double)rand() / RAND_MAX;  

在该步骤之后,必须根据必须计算的一些附加属性(例如粒子之间的距离)删除一些粒子。因此我使用简单的循环:

for (int m=0; m<C; m++){
for(int l=0; l<m; l++){
    r_x[l][m] = X[0][m]-X[0][l]; 
    r_y[l][m] = Y[0][m]-Y[0][l];
    r_z[l][m] = Z[0][m]-Z[0][l];
    r[l][m]= sqrt(r_x[l][m]*r_x[l][m] +r_y[l][m]*r_y[l][m] + r_z[l][m]*r_z[l][m]);

    if(r[l][m] <= ...)...;
    }
}

在最后一步中,坐标必须存储在某个文件中,我使用 fopen 并再次使用一些简单的循环:

    FILE *file;
file=fopen("system.ini","w");
for(int i= 0; i< ...; i++){
    for (int j=0; j<...; j++){
    fprintf(file,"%lf %lf %lf\n",X[i][j],Y[i][j],Z[i][j]);
    }
}

这工作得很好,但现在我必须将系统大小扩大几倍,所以我的 16 GB 内存不再足以计算额外的属性。当然,专业的模拟软件不会占用超过 100 MB 的内存和一小部分的计算时间来进行相同的计算,我怎样才能让这个简单的代码更高效一点呢?

标签: c++

解决方案


为“C++ Sparse Matrix”做一个谷歌,你会发现大量的实现和讨论。

Geeks for Geeks 谈论滚动你自己的。Boost 有一个类。这些是第一页中最有趣的链接。

我认为关键是理解什么是稀疏矩阵。在那之后,剩下的就很简单了。


推荐阅读