首页 > 解决方案 > 遍历 arma::mat 并检索元素位置

问题描述

我正在尝试按元素设置arma::mat值,每个元素的值取决于每个元素的多索引(行、列)。 有没有办法在迭代期间检索元素的当前位置?

基本上,我希望能够在稀疏矩阵迭代器中执行类似操作,it.col()it.row()允许检索当前元素的位置。为了说明,arma::sp_mat迭代器文档中给出的示例)是:

sp_mat X = sprandu<sp_mat>(1000, 2000, 0.1);

sp_mat::const_iterator it     = X.begin();
sp_mat::const_iterator it_end = X.end();

for (; it != it_end; ++it) {
  cout << "val: " << (*it)    << endl;
  cout << "row: " << it.row() << endl;  // only available for arma::sp_mat, not arma::mat
  cout << "col: " << it.col() << endl;  // only available for arma::sp_mat, not arma::mat
}

当然,有许多解决方法可以获取元素位置以进行arma::mat迭代,最直接的方法可能是:

然而,这些对我来说似乎相当老套且容易出错,因为它们需要使用矩阵大小,甚至需要手动处理索引。 我正在寻找一个更清洁(也许是内部优化)的解决方案。我觉得应该有一种方法可以实现这一目标......

除了用于 的解决方案之外,arma::sp_mat对我来说,其他这样的“不错”解决方案将使用.imbueor .for_eachbut with a functor,该仿函数不仅接受元素的当前值,还接受其位置作为附加参数;目前这似乎是不可能的。

标签: c++c++17armadillo

解决方案


查看犰狳源代码,row_col_iterator 提供每个元素的行和列索引。这类似于稀疏矩阵迭代器,但不会跳过零。调整您的代码:

mat X(10,10,fill::randu);

mat::const_row_col_iterator it     = X.begin_row_col();
mat::const_row_col_iterator it_end = X.end_row_col();

for (; it != it_end; ++it) {
  cout << "val: " << (*it)    << endl;
  cout << "row: " << it.row() << endl;
  cout << "col: " << it.col() << endl;
}

推荐阅读