2013-10-14 55 views
13

我是新来的使用犰狳,尽管尝试/搜索相当多,但不能得到以下内容。犰狳C++:矩阵初始化从数组

有两个巨大的(动态)数组(不是向量),我需要执行关联。我决定为此使用犰狳。我知道如何使用向量初始化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,0.9}和c = {0,0.5,1,-2,-5}。输出将是:

A: 
     0 
B: 
    -5.0000 

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

+2

,除非你打算在一次初始化所有的元素,不要使用<<操作(如: A << 4 << 5 << 9)。可以使用循环来设置元素,也可以使用下面由Martin J描述的更高效的aux_mem构造方法。 – mtall

+0

是的,我意识到<<操作符不是这样。 aux_mem工作。谢谢! –

回答

7

假设你的阵列V和C是双数组,你可以使用AUX内存构造函数:

the armadillo doc

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

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

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

  • 垫(常量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

我们如何使用C++ 11初始化列表? – qed