Pertanyaan Armadillo, menemukan indeks maks di setiap kolom


Saya mencari cara untuk menemukan indeks yang sesuai dengan maksimum setiap kolom. Tujuan saya adalah untuk menghindari loop dan menemukan solusi Matlabic menggunakan fungsi vektor armadillo.

Ini dapat dengan mudah dilakukan di Matlab dengan perintah berikut: [~, maxIndices] = max (A);

Di armadillo Anda memiliki fungsi anggota: A.max (row_of_max_val, col_of_max_val); yang memberikan lokasi maksimum di seluruh matriks.

Dan fungsi yang berdiri sendiri vec M = max (A); yang menghasilkan maksimal nilai-nilai setiap kolom tetapi bukan indeksnya.

Tetapi tidak satu pun dari mereka yang melakukan trik.

Memiliki indeks kolom maksimum dapat digunakan untuk menulis banyak algoritma dengan cara yang lebih bervariasi. Misalnya, dapat digunakan dalam Decoding Viterbi, atau dalam pengelompokan k-means.

Tentunya, pertanyaan ini dapat digeneralisasikan mengingat minimum, bukan maksimum dan baris, bukan kolom.

Apakah seseorang memikirkan solusi alternatif?

Terbaik.


5
2017-11-04 08:50


asal


Jawaban:


Saya biasanya pergi dengan pandangan submatrix. Sesuatu di sepanjang garis-garis ini:

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

5
2017-11-04 10:11



Jawaban yang tidak sempurna adalah sesuatu seperti:

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

Masalah:

  1. Beberapa indeks dapat dikembalikan untuk kolom unik jika elemen maksimum ada lebih dari satu kali.
  2. Indeks diberikan relatif ke elemen pertama dari matriks dan bukan elemen pertama dari setiap kolom.

1
2017-11-04 12:12



Armadillo sekarang sudah, .index_max() dan .index_min() metode untuk menemukan indeks ini, seperti versi 7.2.


0
2018-05-11 12:39