gpt4 book ai didi

c++ - 在 C++ 中存储大矩阵 (Armadillo)

转载 作者:搜寻专家 更新时间:2023-10-31 01:07:46 26 4
gpt4 key购买 nike

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

假设我声明一个矩阵

mat X;

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

X.randn(500,500);

尽管没有使用 newdelete,Armadillo 是否动态存储 X(即在堆上)?我问的原因是,Armadillo 似乎允许我将变量声明为:

mat::fixed<n_rows, n_cols> 

quote : “通常比动态内存分配快,但矩阵的大小事后不能改变(直接或间接)”。

不管以上情况——我应该使用这个吗:

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

或者这个:

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

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

最佳答案

Does Armadillo store X dynamically (i.e. on the heap) despite not using new or delete.?

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

The reason I ask, is because it seems Armadillo allows me to declare a variable as (mat::fixed ...)

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

之后,你应该使用

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

如果您已经知道当时的尺寸。在某些情况下,

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

也可以。

我想不出将您的第二个选项与 mat * 指针一起使用的充分理由。首先,像 armadillo 这样的库在内部处理它们的内存分配,开发人员会非常小心地把它做好。此外,即使库中的内存代码被破坏,您的想法 new mat 也不会修复它:您将为 mat 对象分配内存,但该对象是当然相当小。很大一部分可能隐藏在类 mat 中的成员变量 T* data 之后,您无法从外部影响它的分配方式。

我最初错过了您对 n 大小的评论。正如 Mikhail 所说,处理 100000x100000 矩阵比简单地考虑实例化它们的方式需要更多的关注。

关于c++ - 在 C++ 中存储大矩阵 (Armadillo),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18921207/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com