犰狳C++:从数组初始化矩阵

问题描述 投票:0回答:2

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

我需要对两个巨大的(动态)数组(不是向量)执行相关操作。我决定使用犰狳来做到这一点。我了解如何使用向量初始化 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 有什么解决办法吗?预先感谢!

c++ arrays matrix initialization armadillo
2个回答
10
投票

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

来自犰狳文档

  • 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);

0
投票
**1st way:**
double data[] = { 4.74, 0.58 , 2.7,5.12 , 9.73 , 2.7,0.56 , 9.6 , 2.7,9.1, 0.96 , 2.7,0.57 , 1.07 , 2.7,8.85 ,8.8 , 2.7 };
arma::mat anchorCoords(data, 6, 3, false);


**2nd way:**
arma::mat anchorCoords;
anchorCoords 
    << 4.74 << 0.58 << 2.7 << endr
    << 5.12 << 9.73 << 2.7 << endr
    << 0.56 << 9.6 << 2.7 << endr
    << 9.1 << 0.96 << 2.7 << endr
    << 0.57 << 1.07 << 2.7 << endr
    << 8.85 << 8.8 << 2.7;
© www.soinside.com 2019 - 2024. All rights reserved.