【发布时间】:2020-10-29 11:26:08
【问题描述】:
我正在尝试按元素设置arma::mat 的值,每个元素的值取决于每个元素的多索引(行、列)。
有没有办法在迭代期间检索元素的当前位置?
基本上,我希望能够做一些事情like in the sparse matrix iterator,其中it.col() 和it.row() 允许检索当前元素的位置。
为了说明,arma::sp_mat iterator documentation)中给出的例子是:
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 或.for_each,但使用的函子不仅接受元素的当前值,还接受其位置作为附加参数;目前这似乎是不可能的。
【问题讨论】: