2

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

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

问题是执行它(分配内存)所需的时间随着矩阵大小的增加而迅速增加。有谁知道这个问题的更好解决方案?

谢谢。

4

2 回答 2

5

分配一维数组并将索引转换为下标,反之亦然。与分配相比,一次O(N)分配应该快得多。

编辑

具体来说,只是分配N(N+1)/2元素,当你想[r][c]在原始访问时,只需访问即可[r*(r+1)/2 + c]

于 2010-11-23T14:35:26.877 回答
0

是的。

首先......从你的内部循环开始。

“新浮动[2]”

这分配了一个数组,我想它比一个恰好有 2 个浮点数的固定大小的对象分配得更慢。

结构 Float2D { 浮动一个;浮动 b; };

x = 新的 Float2D;

这似乎更好。

但真的,忘记这一切。如果你想要它快......只需 malloc 一堆花车。

我会说......让一些花车浪费掉。只需分配一个普通的旧二维数组。

浮动* f = (float*)malloc( max_number_of_particles*max_number_of_particles*2*sizeof(float) );

您可以克服的唯一尺寸节省是通过使用三角形而不是正方形来节省 2 倍的尺寸。

但是,我非常确定你已经通过使用“new float[2]”和“new float *[i];”杀死了整个“尺寸节省”。我不确定“新”的开销有多少,但我想它就像 malloc 一样,只是更糟。而且我认为大多数 malloc 每次分配大约有 8 个字节的开销。

因此,您已经拥有的比分配一个正方形所损失的 2X 大小更糟糕。

此外,它使数学更简单。你需要做一些奇怪的“三角数”数学来获得指针。像 (n+1)*n/2 之类的东西或者它是什么:)

于 2010-11-23T14:38:54.250 回答