Armadillo: эффективное размещение матрицы в куче - PullRequest
3 голосов
/ 29 ноября 2011

Я использую Armadillo для манипулирования большими матрицами в C ++, считываемыми из CSV-файла.

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) - это столбцы X. X обычно имеет строки в диапазоне от 2000 до 16000. Мой вопрос:

Как я могу выделить (и впоследствии освободить) X в кучу (бесплатный магазин)?

В этом разделе документов Armadillo объясняется распределение вспомогательной памяти мата. Это то же самое, что и распределение кучи? Требуется предварительное знание размеров матрицы, чего я не узнаю, пока X не будет прочитан из csv:

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 использовать ее.

1 Ответ

2 голосов
/ 05 декабря 2011

Рассматривая исходный код, Armadillo уже выделяет большие матрицы в куче.

Чтобы уменьшить объем требуемой памяти, вы можете использовать fmat вместо коврик .Это придет с компромиссом пониженной точности.

fmat использует float, тогда как mat использует double: см. http://arma.sourceforge.net/docs.html#Mat.

Этотакже возможно, что системный администратор вычислительного кластера linux включил ограничения на него (например, каждый пользователь может выделить только до определенного объема максимальной памяти).Например, см. http://www.linuxhowtos.org/Tips%20and%20Tricks/ulimit.htm.

...