【问题标题】:Armadillo and C++ - Matrix initialization with 2D-arrayArmadillo 和 C++ - 使用 2D 数组进行矩阵初始化
【发布时间】:2015-03-03 17:43:14
【问题描述】:

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

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

我在这里找到了关于它的问题:

armadillo C++: matrix initialization from array

问题是,构造函数似乎只适用于一维数组的初始化,而不是二维数组。如果我尝试使用这种方式:

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 矩阵的理想方法是什么?我更喜欢最快的解决方案,因为我需要使用大矩阵。

【问题讨论】:

  • @user3670482 - 根据我的经验,与犰狳相比,Boost 矩阵库相当原始
  • @user3670482 不幸的是,我必须使用犰狳。不过,感谢您的建议;-)
  • @mtall 你试过用 C++11 模式利用 Boost 矩阵吗?你也许可以用它做很多很酷的事情。
  • 顺便说一句,Martin,Modern C++ 的指导方针说你不应该使用拥有指针,即没有新的和删除的。如果您必须使用指针来尊重矩阵,我会说使用类似 unique_ptr 的智能指针

标签: c++ arrays matrix armadillo


【解决方案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;
    

【讨论】:

  • 为了避免复制内存,将arma::mat arma_matrix( matrix, block_size, block_size, true, true )改为arma::mat arma_matrix( matrix, block_size, block_size, false, true ),即。第 4 个参数更改为 false。这更快,但请参阅associated documentation notes 中描述的注意事项(例如,因为您现在直接使用内存,您现在将负责内存释放、处理别名等)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 2020-05-25
  • 2018-08-21
  • 1970-01-01
  • 1970-01-01
  • 2018-07-31
相关资源
最近更新 更多