Armadillo:堆上的高效矩阵分配

Posted

技术标签:

【中文标题】Armadillo:堆上的高效矩阵分配【英文标题】:Armadillo: efficient matrix allocation on the heap 【发布时间】:2011-11-29 17:51:30 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

要减少所需的内存量,您可能需要使用 fmat 而不是 mat。这会以降低精度为代价。

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

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

【讨论】:

犰狳是否也会释放内存,还是应该由用户来完成? @MikelUrkia - 任何正确编写的 C++ 库都会自动释放其对象使用的内存。是什么让您认为需要手动完成? C++ 不是 C。 我是 C 和 C++ 方面的新手,非常感谢您花时间回答我的问题。正如我在另一个问题中提到的,如果 Armadillo 负责内存管理,它将大大减轻我的工作量。

以上是关于Armadillo:堆上的高效矩阵分配的主要内容,如果未能解决你的问题,请参考以下文章

犰狳,如何增长一个向量并获得他的大小?

犰狳:解决 Ax=b 分配堆?

为啥堆上的分配比栈上的分配快?

c ++ - 使用存储在堆上的数组填充对称矩阵

为啥函数执行后没有释放堆上的元素?

C++ Armadillo 和 OpenMp:外积求和的并行化 - 定义 Armadillo 矩阵的约简