Armadillo和C ++ - 用2D数组进行矩阵初始化

时间:2015-03-03 17:43:15

标签: c++ arrays matrix armadillo

我需要使用双精度数组初始化Armadillo矩阵。我在原始文档中找到了这个构造函数:

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

我在SO上找到了关于它的问题:

armadillo C++: matrix initialization from array

问题是,似乎构造函数仅用于使用一维数组进行初始化,而不是2D。如果我尝试使用这种方式:

double **matrix = new double *[block_size];
for(int i = 0; i < block_size; i++) {
    matrix[i] = new double[block_size];
}

arma::mat arma_matrix( &matrix[0][0], matrix_size, matrix_size, true, true );

cout << "am: " << arma_matrix[1][0] << endl;

我收到错误:

fined_grain:103/init_function: In function ‘void place_user_fn_103(ca::Context&, ca::TokenList<double>&)’:
fined_grain:103/init_function:61:42: error: invalid types ‘double[int]’ for array subscript

那么,使用2D阵列初始化Arma矩阵的理想方法是什么?我更喜欢最快的解决方案,因为我需要使用大型矩阵。

1 个答案:

答案 0 :(得分:1)

我快速浏览了一下armadillo library documentation,我看到了以下问题。

  1. 您传递给arma_matrix的参数在语法上是正确的但不正确。你需要使用:

    double *matrix = new double [block_size*block_size];
    arma::mat arma_matrix( matrix, block_size, block_size, true, true );
    
  2. 访问元素的语法是:

    cout << "am: " << arma_matrix(1, 0) << endl;
    

    您也可以使用:

    int row = 1;
    int col = 0;
    cout << "am: " << arma_matrix[row*block_size+col] << endl;