我在C ++中使用Armadillo库来存储/计算大型矩阵。我的理解是,应该动态地(在堆上)存储大型数组/矩阵。
假设我声明了一个矩阵
mat X;
并将大小设置为(比方说)500行,500列随机条目:
X.randn(500,500);
尽管没有使用X
或new
,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之间,并且事先未知。
答案 0 :(得分:4)
Armadillo是否动态存储X(即在堆上),尽管没有 使用
new
或delete
。?
是。库代码中会有某种形式的new
或delete
。你只是没有从外面注意到它。
我问的原因是因为它似乎是犰狳 允许我将变量声明为(
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矩阵需要更多的关注,而不仅仅是考虑实例化它们的方式。