2011-11-29 94 views
2

我正在使用Armadillo來處理從CSV文件讀取的C++中的大型矩陣。犰狳:堆上的高效矩陣分配

mat X; 
X.load("myfile.csv",csv_ascii); 
colvec x1 = X(span::all,0); 
colvec x2 = X(span::all,1); 
//etc. 

所以X1,...,XK(爲k=20說)是將通常具有行範圍爲2000〜16000。我的問題X. X的列是:

我如何分配(並隨後釋放)X到堆(免費存儲)?

This section Armadillo文檔解釋了mat的輔助內存分配。這與堆分配相同嗎?它需要預先了解矩陣尺寸,直到從csv讀取X才知道:

mat(aux_mem*, n_rows, n_cols, copy_aux_mem = true, strict = true) 

任何建議將不勝感激。 (我正在使用g ++ - 4.2.1;我當前的程序在我的Macbook Pro上本地運行良好,但是當我在大學的計算羣集(Linux g ++ - 4.1.2)上運行它時,我遇到了分段錯誤。太大而無法發佈)。

編輯:我落得這樣做:

arma::u32 Z_rows = 10000; 
arma::u32 Z_cols = 20; 
double* aux_mem = new double[Z_rows*Z_cols]; 
mat Z(aux_mem,Z_rows,Z_cols,false,true); 
Z = randn(Z_rows, Z_cols); 

其堆上第一分配內存,然後告訴矩陣Z使用它。

回答

2

通過查看源代碼,Armadillo已經在堆上分配了大型矩陣。

爲了減少所需的內存量,你可能需要使用FMAT代替。這將伴隨着精度降低的折衷。

FMAT使用浮動,而採用雙:看到http://arma.sourceforge.net/docs.html#Mat

Linux計算集羣的系統管理員也可能對其啓用了限制(例如,每個用戶只能分配一定數量的最大內存)。例如,請參閱http://www.linuxhowtos.org/Tips%20and%20Tricks/ulimit.htm

+0

犰狳是否也釋放了內存,或者應該由用戶完成? –

+0

@MikelUrkia - 任何正確編寫的C++庫會自動釋放其對象所使用的內存。是什麼讓你覺得它需要手動完成? C++不是C. – mtall

+0

我在C和C++中很新穎,我很欣賞你花時間回答我的問題。正如我的另一個問題所提到的,如果犰狳負責記憶管理,它將大大地減輕我的工作量。 –