2015-11-04 6 views
6

Sto cercando un modo per trovare l'indice corrispondente al massimo di ogni colonna. Il mio obiettivo è evitare i loop e trovare una soluzione Matlabic usando le funzioni di armadillo vettorializzate.Armadillo, che trova l'indice massimo in ogni colonna

Questo può essere fatto facilmente in Matlab con il seguente comando: [~, maxIndices] = max (A);

In armadillo si ha la funzione membro: A.max (row_of_max_val, col_of_max_val); che danno la posizione del massimo nell'intera matrice.

E la funzione standalone vec M = max (A); che emette il massimo valori di ciascuna colonna ma non i loro indici.

Ma nessuno di loro sta facendo il trucco.

Avere indici massimi delle colonne potrebbe essere utilizzato per scrivere numerosi algoritmi in un modo più vettorializzato. Ad esempio, potrebbe essere utilizzato in una decodifica di Viterbi o in un cluster di k-means.

Ovviamente, questa domanda può essere generalizzata considerando i minimi anziché i massimi e le righe anziché le colonne.

Qualcuno sta pensando a una soluzione alternativa?

Migliore.

+1

nota a margine: Armadillo ha già il cluster k-means. vedere la classe [gmm_diag] (http://arma.sourceforge.net/docs.html#gmm_diag). basta interpretare i mezzi gaussiani come centroidi. – hbrerkere

risposta

6

In genere vado con le viste del sommatore. Qualcosa in questo senso: risposta

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

dovrebbe essere 'A.col (i) .eval(). Max (row_dx)'? la sottoview non ha attualmente una funzione membro '.max()' – hbrerkere

+0

@hbrerkere. Testato con arma-6.200.2. – downhillFromHere

+0

Grazie per la risposta. Ho appena dimenticato di menzionare che stavo cercando di evitare i loop e optare per una soluzione vettoriale "Matlab". – jcolafrancesco

1

A non perfetto sarebbe qualcosa di simile:

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

problemi:

  1. indici multipli possono essere restituiti per una colonna univoca nel caso in cui l'elemento di massima è presente più di una volta.
  2. Gli indici sono dati relativamente al primo elemento della matrice e non al primo elemento di ogni colonna.
0

Armadillo ha ora, .index_max() e .index_min() metodi per trovare questi indici, a partire dalla versione 7.2.

Problemi correlati