Suchen Sie Matrizen in Mathematica 8 - Versuchen Sie, andere Elemente in derselben Zeile wie x zu finden

StackOverflow https://stackoverflow.com/questions/8814296

Frage

Der kursive Text beschreibt mein allgemeines Ziel, wenn jemand interessiert ist. Die Frage ist darunter.

Ich versuche, die Energieniveaus einfacher Moleküle unter Verwendung von Mathematica 8 zu gratschen. Meine Methode ist grob und lautet wie folgt:

  1. Finden Sie Eigenwerte der einfachen Hüchkel -Matrix.
  2. Duplikate löschen und die Größe der Liste bestimmen.
  3. Bewerten Sie die Anzahl der Degeneritäten, indem Sie die doppelte Liste mit der Liste ohne Duplikat vergleichen.
  4. Erstellen Sie Anx 2 Null -Matrix, wobei n die Anzahl der eindeutigen Energieniveaus ist.

5. Füllen Sie die erste Spalte mit eindeutigen Energieniveaus, der zweiten Säule mit Degeneration.

Die in Schritt 5 erzeugte Matrix kann so aussehen:

(1  2)
(3  1)   ==    M
(-1 1)

Ich möchte das Maximum von Spalte 2 bewerten und dann den Wert des Elements in derselben Zeile finden, aber in Spalte 1 ist die Antwort, nach der ich suche, 1.

Diese Befehle bewerten beide auf -1:

Extract[M[[All, 1]], M[[Max[M[[All, 2]]], 1]]]
M[[Max[M[[All, 1]]], 1]]

Welches ist nicht die Antwort, die ich will.

Irgendwelche Tipps?

Bearbeiten: Dies

Part[Part[Position[M, Max[M[[All, 2]]]], 1], 1]

funktioniert, aber ich verstehe nicht warum Ich muss Teil [] zweimal verwenden.

War es hilfreich?

Lösung

Das Innere Part gibt Ihnen das erste Ereignis des Maximums. Position Gibt eine Liste von Positionen zurück, auch wenn es nur ein Element gibt, das den maximalen Wert hat, wie folgt:

 M = {{2, 2}, {2, 3}, {2, 2}, {1, 1}}

 {{2, 2}, {2, 3}, {2, 2}, {1, 1}}

Position[M, Max[M[[All, 2]]]]

 {{2, 2}}

Sie möchten also das erste Element im ersten Element dieser Ausgabe. Sie könnten Ihren Code so kondensieren:

Position[M, Max[M[[All, 2]]]][[1, 1]]

Eine Sache, von der ich denke, dass Ihr Code besser verarbeitet wird, ist dieser Fall:

 M = {{3, 2}, {2, 3}, {2, 2}, {1, 1}}

3, 2}, {2, 3}, {2, 2}, {1, 1}}

Position[M, Max[M[[All, 2]]]]

{{1, 1}, {2, 2}}

Sie erhalten in diesem Fall die falsche Antwort mit Ihrem Code.

Besser wäre:

M[[All, 1]][[Position[M[[All, 2]], Max[M[[All, 2]]]][[1, 1]] ]]

Oder alternativ

M[[Position[M[[All, 2]], Max[M[[All, 2]]]][[1, 1]], 1]]

Andere Tipps

m = {{1, 2}, {3, 1}, {-1, 1}}
max = Max[m[[All, 2]]]

Suchen Sie also die Position des Maximum und ersetzen Sie die zweite Spalte durch die erste:

pos=Position[m, max] /. {x_,_}:>{x,1}
{{1,1}}

Nehmen Sie dann das erste Element von POS, dh {1,1} und verwenden Sie es in Part

m[[Sequence @@ First[pos]]]
1

Aber als ich gesagt habe, dass ich so etwas bevorzuge:

Cases[m, {x_, max} :> x]
{1}

Das Ergebnis ist eine Liste. Sie könnten entweder verwenden First@Cases[...] Oder Sie möchten eine Liste von Ergebnissen beibehalten, um Fälle abzudecken, in denen der Maximalwert mehr als einmal in einer Spalte auftritt.

Wenn Sie nur einen einzelnen Spalte -Wert im Fall von doppelten Maximalwerten in Spalte zwei wünschen, schlage ich vor, dass Sie verwenden Ordering:

m = {{1, 3}, {1, 8}, {5, 7}, {2, 2}, {1, 9}, {4, 9}, {5, 6}};

m[[ Ordering[m[[All, 2]], -1], 1 ]]
{4}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top