Поиск матриц в Mathematica 8 - Попытка найти другие элементы в той же строке, что и X - PullRequest
1 голос
/ 11 января 2012

Текст, выделенный курсивом, описывает мою общую цель, если кому-то интересно. Вопрос внизу.

Я пытаюсь построить график энергетических уровней простых молекул с помощью Mathematica 8. Мой метод грубый и выглядит так:

  1. Найти собственные значения простой матрицы Хюккеля.
  2. Удалить дубликаты и определить размер списка.
  3. Оцените количество вырождений, сравнив дублирующийся список со списком без дубликатов.
  4. Создать нулевую матрицу n x 2, где n - количество уникальных уровней энергии.

5. Заполните первый столбец с уникальными уровнями энергии, второй столбец с вырождениями.

Матрица, сгенерированная на шаге 5, может выглядеть так:

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

Я хочу оценить максимум столбца 2, а затем найти значение элемента в той же строке, но в столбце 1. В этом случае я ищу ответ 1.

Обе команды имеют значение -1:

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

это не тот ответ, который я хочу.

Есть какие-нибудь советы?

РЕДАКТИРОВАТЬ: This

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

работает, но я не понимаю почему я должен использовать Part [] дважды.

Ответы [ 3 ]

3 голосов
/ 11 января 2012
m = {{1, 2}, {3, 1}, {-1, 1}}
max = Max[m[[All, 2]]]

Итак, найдите положение максимума и замените второй столбец первым:

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

Затем возьмите первый элемент из pos, то есть {1,1}, и используйте его в Part

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

Но, сказав, что я предпочитаю что-то вроде этого:

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

Результатом является список. Вы можете использовать First@Cases[...] или сохранить список результатов, чтобы охватить случаи, когда максимальное значение встречается в столбце более одного раза.

2 голосов
/ 12 января 2012

Если вам нужен только один столбец и одно значение в случае дублирования максимальных значений во втором столбце, я предлагаю вам использовать Ordering:

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

m[[ Ordering[m[[All, 2]], -1], 1 ]]
{4}
2 голосов
/ 11 января 2012

Внутренний Part дает вам первое вхождение в максимум.Position возвращает список позиций, даже если существует только один элемент с максимальным значением, например:

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

Итак, вам нужен первый элемент в первом элементе этого вывода.Вы могли бы сжать ваш код следующим образом:

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

Однако, я думаю, что ваш код должен обрабатывать лучше, это случай:

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

Вы получите неправильный ответВаш код в этом случае.

Лучше было бы:

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

Или альтернативно

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