如何加快c ++中二维三角矩阵的内存分配?

时间:2010-11-23 14:30:19

标签: c++ matrix dynamic-allocation triangular

我需要为表示三角矩阵的非常大的数组分配内存。 我写了以下代码:

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];

问题在于,随着矩阵大小的增加,执行此操作(分配内存)所需的时间会迅速增加。有没有人知道这个问题的更好解决方案?

感谢。

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或其他任何东西:)