Domanda

Il testo in corsivo descrive il mio obiettivo generale, se qualcuno è interessato. La domanda è al di sotto.

Sto cercando di rappresentare graficamente i livelli di energia di semplici molecole utilizzando il metodo Mathematica 8. Il mio è grezza, e va come questo:

  1. Trova autovalori della matrice di Hückel semplice.
  2. i duplicati eliminare e determinare la dimensione della lista.
  3. valutare il numero di degenerazioni confrontando elenco duplicato con nessun-duplicato lista.
  4. Creare un n x 2 matrice zero quando n è il numero di livelli energetici unici.

5. Riempire prima colonna con livelli di energia unici, seconda colonna con degenerazioni.

La matrice generata al passaggio 5 potrebbe essere questa:

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

Vorrei valutare il massimo di colonna 2, e poi trovare il valore dell'elemento nella stessa riga, ma nella colonna 1. In questo caso, la risposta che sto cercando è 1.

Questi comandi entrambe restituiscono -1:

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

, che non è la risposta che voglio.

Qualche consiglio?

EDIT: Questo

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

opere, ma non capisco perché devo usare parte due volte [].

È stato utile?

Soluzione

Il Part interno vi dà la prima occorrenza del massimo. Position restituisce una lista di posizioni, anche se v'è un solo elemento che ha il valore massimo, in questo modo:

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

Così si vuole il primo elemento nel primo elemento di questa uscita. Si potrebbe condensare il codice in questo modo:

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

Tuttavia, una cosa che penso che le vostre esigenze codice per gestire meglio questo caso è:

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

Si otterrà la risposta sbagliata con il codice in questo caso.

Una migliore potrebbe essere:

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

In alternativa

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

Altri suggerimenti

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

Quindi, trovare la posizione del massimo e sostituire la seconda colonna con la prima:

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

Poi prendere il primo elemento di posizione, ad esempio {1,1} e sub uso in Part

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

Ma detto che preferisco qualcosa di simile:

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

Il risultato è una lista. Si potrebbe o uso First@Cases[...] oppure si potrebbe desiderare di mantenere un elenco di risultati per coprire casi in cui si verifica il valore massimo più di una volta in una colonna.

Se si desidera solo un singolo valore una colonna nel caso di valori massimi duplicati nella colonna due vi suggerisco di fare uso di Ordering:

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

m[[ Ordering[m[[All, 2]], -1], 1 ]]
{4}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top