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

16

我对使用armadillo不熟悉,尽管我试过并进行了相当多的搜索,但仍然无法理解下面的内容。

有两个我需要对其执行相关性计算的庞大(动态)数组(而不是向量)。 我决定使用armadillo来解决这个问题。我知道如何使用向量初始化arma :: mat,但我能否使用数组来实现呢?根据文档,我想我不能。出于内部设计原因,我想避免使用向量。我尝试手动使用样本数组初始化每个元素(作为愚蠢但起点)。 像以下代码一样的东西行不通:

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?提前致谢!


2
除非您要一次性初始化所有元素(例如 A << 4 << 5 << 9),否则不要使用<<运算符。要么使用循环设置元素,要么使用Martin J描述的更有效的aux_mem构造方法。 - mtall
是的,我意识到 << 运算符不是正确的方法。aux_mem 起了作用。谢谢! - ND_27
1个回答

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

来自armadillo文档

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

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

strict变量只在将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);

1
我们如何使用C++11的初始化列表? - qed
我认为这里存在一个问题:armadillo使用列主内存存储。因此,您需要转置armadillo矩阵。 - ben26941
一个相关的问题:如何动态地参数化armadillo矩阵,而不是硬编码行和列的尺寸?我在这里提出了更详细的版本的问题:https://dev59.com/wb_qa4cB1Zd3GeqPByzS - rawpointer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接