犰狳,在每一列中找到最大指数

时间:2015-11-04 08:50:57

标签: c++ c++11 armadillo

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

使用以下命令可以在Matlab中轻松完成: [〜,maxIndices] = max(A);

在犰狳中你有成员函数: A.max(row_of_max_val,col_of_max_val); 给出整个矩阵中最大值的位置。

独立功能 vec M = max(A); 输出每列的最大但不输出其索引。

但他们都没有做到这一点。

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

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

有人在想另类解决方案吗?

最佳。

3 个答案:

答案 0 :(得分:5)

我通常会使用子矩阵视图。这些方面的东西:

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;
}

答案 1 :(得分:1)

一个不完美的答案就是:

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

问题:

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

答案 2 :(得分:0)

从版本7.2开始,

Armadillo现在有.index_max().index_min()方法来查找这些索引。