2010-11-23 39 views
2

我需要爲代表三角矩陣的非常大的數組分配內存。 我寫了下面的代碼:如何加快C++中二維三角矩陣的內存分配?

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

的問題是,要做到這一點(分配內存)所需的時間迅速用矩陣的大小增加而增加。有誰知道這個問題的更好的解決方案?

謝謝。

+1

您確定需要分配所有元素嗎?你可以在初次使用時初始化它們;無論如何,這種使用可能比分配花費更多的時間。 – 2010-11-23 14:33:54

+0

不是`dis_vec [i] [j]`a`float`,而不是`float *`?而不應該在第一個循環中的賦值是`dis_vec [i] = new float * [i + 1]`? – lijie 2010-11-23 14:37:54

回答

5

分配一維數組並將索引轉換爲下標,反之亦然。與O(N)分配相比,一個分配應該快得多。

編輯

具體來說,僅分配N(N+1)/2元素,當你要訪問[r][c]原,只需訪問[r*(r+1)/2 + c]代替。

0

是的。

首先...從你的內循環開始。

「新的浮動[2]」

即分配一個數組,我想是慢於一個固定的大小對象恰好有2個漂浮分配。

struct Float2D {float 0; float 1; float b; };

x = new Float2D;

這似乎更好。

但是真的,忘了所有這一切。如果你想快點......只是malloc一堆浮游物。

我會說......讓一些花車去浪費。只需分配一個普通的舊的二維數組。 float * f =(float *)malloc(max_number_of_particles * max_number_of_particles * 2 * sizeof(float));

節省您的唯一尺寸可以解決這個問題,通過使用三角形而非方形來節省2倍的尺寸。

但是,我非常該死的肯定你已經通過使用「new float [2]」和「new float * [i];」殺死了整個「尺寸節省」。我不確定「新」的開銷是多少,但我想像它更像malloc。我認爲大多數malloc每個分配大約有8個字節的開銷。

所以你已經是WORSE比分配一個正方形丟失2X大小。

此外,它使數學更簡單。你需要做一些奇怪的「三角數字」數學來獲得指針。像(n + 1)* n/2或其他任何東西:)