用C ++存储大矩阵(Armadillo)

时间:2013-09-20 16:08:12

标签: c++ matrix armadillo

我在C ++中使用Armadillo库来存储/计算大型矩阵。我的理解是,应该动态地(在堆上)存储大型数组/矩阵。

假设我声明了一个矩阵

mat X;

并将大小设置为(比方说)500行,500列随机条目:

X.randn(500,500);

尽管没有使用Xnew,Armadillo是否会动态存储delete(即在堆上)。我问的原因是因为看起来Armadillo允许我将变量声明为:

mat::fixed<n_rows, n_cols> 

其中,quote:&#34;通常比动态内存分配更快,但矩阵的大小不能随后(直接或间接)改变&#34;。

无论上述情况如何 - 我应该使用它:

mat A;
A.set_size(n-1,n-1);  

或者这个:

mat *A = new mat;
(*A).set_size(n-1,n-1);

其中n介于1000或100000之间,并且事先未知。

1 个答案:

答案 0 :(得分:4)

  

Armadillo是否动态存储X(即在堆上),尽管没有   使用newdelete。?

是。库代码中会有某种形式的newdelete。你只是没有从外面注意到它。

  

我问的原因是因为它似乎是犰狳   允许我将变量声明为(mat::fixed ...)

你必须查看源代码,看看这里到底发生了什么。我的猜测是它有某种内部逻辑,决定如何根据大小处理事物。但是,您通常会将mat::fixed用于小型矩阵。

之后,您应该使用

mat A(n-1,n-1);

如果你已经知道那个点的大小。在某些情况下,

mat A;
A.set_size(n-1,n-1);  

也可能没问题。

我无法想出使用mat *指针的第二个选项的充分理由。首先,像armadillo这样的库在内部处理它们的内存分配,开发人员非常谨慎地做好准备。此外,即使库中的内存代码被破坏,您的想法new mat也无法修复它:您将为mat对象分配内存,但该对象肯定相当小。最重要的部分可能隐藏在类T* data中的成员变量mat之类的内容之后,并且您无法影响从外部分配它的方式。

我最初错过了对n大小的评论。正如米哈伊尔所说,处理100000x100000矩阵需要更多的关注,而不仅仅是考虑实例化它们的方式。