c++ - 遍历 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
迭代,最直接的方法可能是:
for
在行和列大小上使用嵌套循环。- 使用单个
for
循环,并使用矩阵大小,将迭代次数转换为行和列索引。 - 某种形式的“压缩”迭代,对象包含或计算相应的索引。
然而,这些对我来说似乎相当老套且容易出错,因为它们需要使用矩阵大小,甚至需要手动处理索引。 我正在寻找一个更清洁(也许是内部优化)的解决方案。我觉得应该有一种方法可以实现这一目标......
除了用于 的解决方案之外,arma::sp_mat
对我来说,其他这样的“不错”解决方案将使用.imbue
or .for_each
but with a functor,该仿函数不仅接受元素的当前值,还接受其位置作为附加参数;目前这似乎是不可能的。
解决方案
查看犰狳源代码,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;
}
推荐阅读
- ubuntu - 如何将 osd、equ.traineddata 和其他经过训练的数据文件(孟加拉语、印地语)与 pytesseract 一起使用(命令以及 eq.traineddata 的放置位置)
- javascript - Fetch 返回字符串而不是 JSON
- swift - SwiftUI/Combine:订阅@Binding 的值变化
- php - 服务器抛出错误 405:尝试与我的回调 URL 通信时不允许使用方法
- javascript - 如何获取通过objectstore.add()添加到IndexedDB的对象的(自动增量)id?
- ios - 有没有办法让 TextInput 表现得像一个按钮,即能够被选中(onPress)或者用户可以输入按钮的标题?
- c# - 将字符串转换为 RestSharp 定义的调用方法
- java - 无法使用 Kafka Connect 从 SAP HANA 获取记录
- pandas - 检查几行日期时间是否在其他两个值之间
- c++ - 从同一类继承两次的类的意外大小