Pregunta

El texto en cursiva describe mi objetivo general, si alguien está interesado. La pregunta está debajo.

Estoy tratando de graficar los niveles de energía de las moléculas simples usando Mathematica 8. Mi método es crudo y va así:

  1. Encuentra valores propios de la matriz simple de Hückel.
  2. Eliminar duplicados y determinar el tamaño de la lista.
  3. Evalúe el número de degeneraciones comparando una lista duplicada con una lista sin duplicada.
  4. Cree la matriz ANX 2 cero donde n es el número de niveles de energía únicos.

5. Llene la primera columna con niveles de energía únicos, segunda columna con degeneraciones.

La matriz generada en el paso 5 puede verse así:

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

Deseo evaluar el máximo de la columna 2, y luego encontrar el valor del elemento en la misma fila, pero en la columna 1. En este caso, la respuesta que busco es 1.

Estos comandos evalúan -1:

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

Que no es la respuesta que quiero.

¿Algun consejo?

Edita esto

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

funciona, pero no entiendo por qué Tengo que usar la parte [] dos veces.

¿Fue útil?

Solución

El interior Part Te da la primera ocurrencia del máximo. Position Devuelve una lista de posiciones, incluso si solo hay un elemento que tiene el valor máximo, como este:

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

Por lo tanto, desea el primer elemento en el primer elemento de esta salida. Podrías condensar tu código así:

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

Sin embargo, una cosa que creo que su código necesita manejar mejor es este 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}}

Obtendrá la respuesta incorrecta con su código en este caso.

Mejor sería:

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

O alternativamente

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

Otros consejos

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

Entonces, encuentre la posición del máximo y reemplace la segunda columna con la primera:

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

Luego tome el primer elemento de POS, es decir, {1,1} y subsézalo en Part

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

Pero habiendo dicho eso, prefiero algo como esto:

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

El resultado es una lista. Podrías usar First@Cases[...] O es posible que desee mantener una lista de resultados para cubrir casos en los que el valor máximo ocurre más de una vez en una columna.

Si solo desea una sola columna un valor en el caso de valores máximos duplicados en la columna dos, le sugiero que haga uso 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}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top