Heap 犰狳:堆上的高效矩阵分配 < >我使用ARMADILO操作C++中从CSV文件中读取的大矩阵。 mat X; X.load("myfile.csv",csv_ascii); colvec x1 = X(span::all,0); colvec x2 = X(span::all,1); //etc.

Heap 犰狳:堆上的高效矩阵分配 < >我使用ARMADILO操作C++中从CSV文件中读取的大矩阵。 mat X; X.load("myfile.csv",csv_ascii); colvec x1 = X(span::all,0); colvec x2 = X(span::all,1); //etc.,heap,armadillo,Heap,Armadillo,所以x1,…,xk(对于k=20say)是X的列。X的行通常在2000到16000之间。我的问题是: 如何将X分配(并随后取消分配)到堆(免费存储)? 犰狳博士解释了mat的辅助内存分配。这与堆分配相同吗?它需要矩阵尺寸的先验知识,在从csv读取X之前,我不会知道: mat(aux_mem*, n_rows, n_cols, copy_aux_mem = true, strict = true) 如有任何建议,将不胜感激。(我使用的是g++-4.2.1;我当前的程序在Macbook Pro上

所以x1,…,xk(对于
k=20
say)是X的列。X的行通常在2000到16000之间。我的问题是:

如何将X分配(并随后取消分配)到堆(免费存储)?

犰狳博士解释了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使用它。

通过查看源代码,Armadillo已经在堆上分配了大型矩阵

为了减少所需的内存量,您可能希望使用fmat而不是mat。这将带来精度降低的权衡

fmat使用float,而mat使用double:请参阅


linux计算集群的系统管理员也可能对其启用了限制(例如,每个用户只能分配一定数量的最大内存)。例如,参见.P/> ARMADILO是否也释放了内存,或者用户应该这样做吗?@ MikelUrkia——任何适当编写的C++库都会自动释放其对象所使用的内存。是什么让你认为这需要手动完成?C++不是C。我在C和C++中是很新的,我很感激你回答我问题的时间。正如我在另一个问题中提到的,如果犰狳负责内存管理,它将大大简化我的工作。