c++ - 在 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++ Sparse Matrix”做一个谷歌,你会发现大量的实现和讨论。
Geeks for Geeks 谈论滚动你自己的。Boost 有一个类。这些是第一页中最有趣的链接。
我认为关键是理解什么是稀疏矩阵。在那之后,剩下的就很简单了。
推荐阅读
- javascript - 如何从 React Native 中的 Firestore 获取集合中的所有文档
- sql - 需要帮助在 SQL JOIN 中设置列值
- python - 为什么 logger.get_logger(__name__) 总是有效?
- javascript - Javascript对象过滤
- cordova - 尝试运行发布 apk 时没有未签名的 apk?
- java - 抛出异常;嵌套异常是 java.lang.NoClassDefFoundError: org/codehaus/jackson/JsonFactory
- c# - 正则表达式替换问题?
- constraints - DDD 和唯一性约束
- python - 使用matplotlib以斜体编写标签时如何避免字体更改?
- python - 从另一个列表中列出的列表中打印项目