Armadillo,在每列中找到最大索引

Armadillo, finding max index in each column

本文关键字:索引 Armadillo      更新时间:2023-10-16

我正在寻找一种方法来找到对应于每列最大值的索引。我的目标是避免循环,并使用矢量化的armadillo函数找到Matlabic解决方案。

这可以在Matlab中通过以下命令轻松完成:[~,maxIndics]=max(A);

在armadillo中,您具有成员功能:A.max(行_of_max_val,列_of_mal_val);给出了整个矩阵中最大值的位置。

以及独立功能vec M=最大值(A);它输出每列的最大,但不输出它们的索引。

但他们中没有一个人在耍花招。

拥有列最大值的索引可以用于以更矢量化的方式编写许多算法。例如,它可以用于维特比解码,或者用于k均值聚类。

显然,这个问题可以推广到考虑最小值而不是最大值,考虑行而不是列。

有人在考虑另一种解决方案吗?

最好。

我通常使用子矩阵视图。大致如下:

using idx_type = arma::uword;
using namespace std;
using namespace arma;
template<typename T>
vector<idx_type>
colwise_max_idx(const Mat<T>& A) {
    vector<idx_type> res;
    for (idx_type i = 0; i != A.n_cols; ++i) {
        idx_type row_idx;
        A.col(i).max(row_idx);
        res.push_back(row_idx);
    }
    return res;
}

Armadillo现在有.index_max().index_min()方法来查找这些索引,从7.2版开始。

一个不完美的答案应该是:

uvec indices = find((A.each_row()-max(A)) == 0);

问题:

  1. 如果max元素出现多次,则可以为一个唯一列返回多个索引
  2. 相对于矩阵的第一个元素而不是每列的第一个元件给出索引