Поиск матриц в Mathematica 8 - Попытка найти другие элементы в том же ряду, что и x
-
26-10-2019 - |
Вопрос
Текст курсивом описывает мою общую цель, если кто -то заинтересован. Вопрос внизу.
Я пытаюсь график уровни энергии простых молекул, используя Mathematica 8. Мой метод грубо и делает это:
- Найдите собственные значения простой матрицы Хюккеля.
- Удалить дубликаты и определить размер списка.
- Оцените количество вырожденных, сравнивая дубликат списка с бездаковым списком.
- Создайте Sharce 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]]
который я не хочу.
Какие-нибудь советы?
РЕДАКТИРОВАТЬ: Это
Part[Part[Position[M, Max[M[[All, 2]]]], 1], 1]
работает, но я не понимаю Почему Я должен использовать часть [] дважды.
Решение
Внутренний 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]]
Другие советы
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[...]
Или вы можете оставить список результатов, чтобы покрыть случаи, когда максимальное значение происходит более одного раза в столбце.
Если вам нужен только один столбец одно значение в случае дублирования максимальных значений во втором столбце, я предлагаю вам использовать Ordering
:
m = {{1, 3}, {1, 8}, {5, 7}, {2, 2}, {1, 9}, {4, 9}, {5, 6}};
m[[ Ordering[m[[All, 2]], -1], 1 ]]
{4}