armadillo C++:从数组初始化矩阵

Posted

技术标签:

【中文标题】armadillo C++:从数组初始化矩阵【英文标题】:armadillo C++: matrix initialization from array 【发布时间】:2013-10-14 22:10:15 【问题描述】:

我是使用犰狳的新手,尽管尝试/搜索了很多,但无法获得以下内容。

我需要对两个巨大的(动态)数组(不是向量)执行关联。我决定为此使用犰狳。我了解如何使用向量初始化 arma::mat,但我可以使用数组来这样做吗?我不明白,因为我在documentation 中没有看到任何提及。 出于内部设计原因,我试图避免使用向量。 我尝试使用示例数组手动初始化每个元素(作为一个愚蠢但起点)。类似下面的代码是行不通的。

using namespace std;
using namespace arma;   

mat A(SIZE, 1), B(SIZE, 1);

for(int i = 0; i < SIZE; i++)

    A << v[i] << endr;
    B << c[i] << endr;


cout << "A: " << endl;
A.print();
cout << "B: " << endl;
B.print();

对于输入数组 v = 1, 2, 0, -1, .9 和 c = 0, .5, 1, -2, -5。输出将是:

A:
        0
B:
  -5.0000

这是可以理解的。 使用数组初始化 arma::mat 或 arma::colvector 的任何解决方法?提前致谢!

【问题讨论】:

不要使用 是的,我意识到 【参考方案1】:

假设您的数组 v 和 c 是双精度数组,您可以只使用辅助内存构造函数:

来自the armadillo doc:

mat(aux_mem*, n_rows, n_cols, copy_aux_mem = true, strict = true)

使用可写辅助存储器中的数据创建矩阵。默认情况下,矩阵分配自己的内存并从辅助内存中复制数据(为了安全)。但是,如果 copy_aux_mem 设置为 false,矩阵将改为直接使用辅助内存(即不复制)。这更快,但除非您知道自己在做什么,否则可能很危险!

仅当 copy_aux_mem 设置为 false(即矩阵直接使用辅助内存)时,严格变量才会生效。如果 strict 设置为 true,则矩阵将在其生命周期内绑定到辅助内存;矩阵中元素的数量不能(直接或间接)改变。如果 strict 设置为 false,则矩阵在其生命周期内不会绑定到辅助存储器,即可以更改矩阵的大小。如果请求的元素数量与辅助内存的大小不同,则会分配新的内存,辅助内存将不再使用。

mat(const aux_mem*, n_rows, n_cols)

通过从只读辅助存储器复制数据来创建矩阵。

这意味着您可以像这样复制源数据来创建矩阵:

mat A_Copy(v, SIZE, 1);
mat B_Copy(c, SIZE, 1);

或者您实际上可以重用已为数组分配的内存来创建只读矩阵,如下所示:

mat A_InPlace(v, SIZE, 1, /*copy_aux_mem*/false, /*strict*/true);
mat B_InPlace(c, SIZE, 1, /*copy_aux_mem*/false, /*strict*/true);

如果你使用向量,这会变得更简单

vec A_Vec_Copy(v, SIZE);
vec B_Vec_Copy(c, SIZE);

或者:

vec A_Vec_InPlace(v, SIZE, false, true);
vec B_Vec_InPlace(c, SIZE, false, true);

【讨论】:

如何使用c++11初始化列表? 我认为这有一个问题:犰狳使用列主要内存存储。所以你必须转置犰狳矩阵。 请回答相关问题。如何动态参数化犰狳矩阵而不是硬编码行和列维度?我在这里问了这个问题的更详细版本:***.com/questions/65868123/…

以上是关于armadillo C++:从数组初始化矩阵的主要内容,如果未能解决你的问题,请参考以下文章

C ++ Armadillo:来自二维矩阵的索引数组

在 C++ 中存储大矩阵(犰狳)

armadillo C++:无法将浮点二维数组写入 fmat

使用 Armadillo C++ 加载稀疏矩阵

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

Armadillo:堆上的高效矩阵分配