我需要为表示三角矩阵的非常大的数组分配内存。 我写了以下代码:
const int max_number_of_particles=20000;
float **dis_vec;
dis_vec = new float **[max_number_of_particles];
for (i = 0; i<max_number_of_particles; i++)
dis_vec[i] = new float *[i];
for (i = 0; i<max_number_of_particles; i++)
for (j = 0; j<i; j++)
dis_vec[i][j] = new float[2];
问题在于,随着矩阵大小的增加,执行此操作(分配内存)所需的时间会迅速增加。有没有人知道这个问题的更好解决方案?
感谢。
答案 0 :(得分:5)
分配一维数组并将索引转换为下标,反之亦然。与O(N)
分配相比,一次分配应该快得多。
修改强>
具体来说,只需分配N(N+1)/2
个元素,当您想要访问原始内容中的[r][c]
时,只需访问[r*(r+1)/2 + c]
。
答案 1 :(得分:0)
是
首先......从内循环开始。
“new float [2]”
分配一个数组,我想这个数组分配的速度比碰巧有2个浮点数的固定大小的对象慢。
struct Float2D { 漂浮一个; 浮b; };
x = new Float2D;
似乎更好。
但实际上,忘了这一切。如果你想要它快......只需要malloc一堆花车。
我会说......让一些花车浪费掉。只需分配一个普通的旧2D数组。
float * f =(float *)malloc(max_number_of_particles * max_number_of_particles * 2 * sizeof(float));
通过使用三角形而不是正方形,可以节省2倍的尺寸。
然而,我非常确定你已经通过使用“new float [2]”和“new float * [i];”来杀死整个“大小节省”。我不确定“新”的开销是多少,但我想它就像malloc一样,更糟糕的是。我认为大多数mallocs每次分配大约有8个字节的开销。
所以你所拥有的就是通过分配一个正方形而损失的2倍大小。
此外,它使数学更简单。你需要做一些奇怪的“三角数”数学来得到指针。像(n + 1)* n / 2或其他任何东西:)