2015-11-04 4 views
6

Ich suche nach einer Möglichkeit, den Index zu finden, der dem Maximum jeder Spalte entspricht. Mein Ziel ist es, Schleifen zu vermeiden und eine Matlabic-Lösung mit vektorisierten Armadillo-Funktionen zu finden.Armadillo, Max Index in jeder Spalte finden

Dies kann einfach in Matlab mit dem folgenden Befehl durchgeführt werden: [~, maxIndices] = max (A);

Im Gürteltier haben Sie die Mitgliedsfunktion: A.max (row_of_max_val, col_of_max_val); , die den Ort des Maximums in der gesamten Matrix angeben.

Und die Standalone-Funktion vec M = max (A); , die die maximalen Werte jeder Spalte aber nicht ihre Indizes ausgibt.

Aber keiner von ihnen macht den Trick.

Mit Spalten Maximum Indizes könnten verwendet werden, um zahlreiche Algorithmen in einer stärker vektorisierten Weise zu schreiben. Zum Beispiel könnte es in einer Viterbi-Decodierung oder in einer k-Means-Clusterbildung verwendet werden.

Offensichtlich kann diese Frage verallgemeinert werden unter Berücksichtigung von Minimum statt Maximum und Zeilen statt Spalten.

Ist jemand an eine alternative Lösung gedacht?

Am besten.

+1

Randnotiz: Armadillo hat bereits K-Means-Clustering. Siehe die Klasse [gmm_diag] (http://arma.sourceforge.net/docs.html#gmm_diag). interpretiere einfach die Gauss'schen Mittel als Zentroide. – hbrerkere

Antwort

6

Ich gehe normalerweise mit den Submatrixansichten. Etwas in dieser Richtung:

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

sollte dies 'A.col (i) .eval(). Max (row_dx)' sein? Die Unteransicht hat derzeit keine'.max() 'Elementfunktion – hbrerkere

+0

@hbrerkere Es tut. Getestet mit arma-6.200.2. – downhillFromHere

+0

Danke für Ihre Antwort. Ich habe nur vergessen zu erwähnen, dass ich versuchte Schleifen zu vermeiden und eine "vektorbasierte" Matlab-Lösung zu verwenden. – jcolafrancesco

1

Eine nicht perfekte Antwort wäre so etwas wie:

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

Probleme:

  1. Mehrere Indizes können für eine eindeutige Spalte, falls das maximale Element zurückgegeben werden ist mehr als einmal vorhanden.
  2. Indizes werden relativ zum ersten Element der Matrix und nicht zum ersten Element jeder Spalte angegeben.
0

Armadillo jetzt hat, .index_max() und .index_min() Methoden, um diese Indizes zu finden, die ab Version 7.2.