3

我正在使用 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比如说)是 X 的列。X 通常会有 2000 到 16000 的行。我的问题是:

如何将 X 分配(并随后解除分配)到堆(空闲存储)上?

Armadillo 文档的这一部分解释了垫子的辅助内存分配。这和堆分配一样吗?它需要矩阵维度的先验知识,在从 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 使用它。

4

1 回答 1

2

通过查看源代码,犰狳已经在堆上分配了大矩阵。

要减少所需的内存量,您可能需要使用fmat而不是mat。这将伴随着精度降低的权衡。

fmat使用浮点数,而mat使用双精度数:参见http://arma.sourceforge.net/docs.html#Mat

也有可能是 linux 计算集群的系统管理员对其启用了限制(例如,每个用户最多只能分配一定数量的最大内存)。例如,请参阅http://www.linuxhowtos.org/Tips%20and%20Tricks/ulimit.htm

于 2011-12-05T05:16:58.467 回答