Recherche en matrices dans Mathematica 8 - Essayer de trouver d'autres éléments sur la même ligne que X

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

Question

Le texte en italique décrit mon objectif général, si quelqu'un est intéressé. La question est en dessous.

Je suis en train de représenter graphiquement les niveaux d'énergie des molécules simples en utilisant la méthode Mathematica 8. Mon est brut, et va ceci:

  1. Trouver de la matrice de valeurs propres Hückel simple.
  2. Supprimer les doublons et déterminer la taille de la liste.
  3. évaluer le nombre de dégénérescences en comparant la liste en double sans-double liste.
  4. Créer une n x 2 matrice nulle où n est le nombre de niveaux d'énergie uniques.

5. Remplissez la première colonne avec des niveaux d'énergie uniques, deuxième colonne avec dégénérescences.

La matrice générée à l'étape 5 peut ressembler à ceci:

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

Je souhaite évaluer le maximum de la colonne 2, puis trouver la valeur de l'élément dans la même ligne, mais dans la colonne 1. Dans ce cas, la réponse que je cherche est 1.

Ces commandes sont évaluées à la fois -1:

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

qui n'est pas la réponse que je veux.

Des conseils?

EDIT: Ce

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

oeuvres, mais je ne comprends pas pourquoi Je dois utiliser partie [] deux fois.

Était-ce utile?

La solution

La Part intérieure vous donne la première occurence du maximum. Position retourne une liste de positions, même s'il n'y a qu'un seul élément qui a la valeur maximale, comme ceci:

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

Vous voulez donc le premier élément dans le premier élément de cette sortie. Vous pouvez condenser votre code comme ceci:

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

Cependant, une chose que je pense que vos besoins de code pour mieux gérer ce cas est:

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

Vous obtiendrez la mauvaise réponse avec votre code dans ce cas.

Il serait mieux:

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

Ou bien

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

Autres conseils

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

Donc, trouver la position du max et remplacer la deuxième colonne avec le premier:

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

Puis prendre le premier élément de pos, à savoir {1,1} et sous utilisation dans Part

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

Mais après avoir dit que je préfère quelque chose comme ceci:

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

Le résultat est une liste. Vous pouvez soit First@Cases[...] d'utilisation ou vous pouvez garder une liste de résultats à couvrir les cas où la valeur maximale se produit plus d'une fois dans une colonne.

Si vous voulez seulement une seule colonne valeur dans le cas des valeurs maximales en double dans la deuxième colonne, je vous suggère de faire usage de Ordering:

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

m[[ Ordering[m[[All, 2]], -1], 1 ]]
{4}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top