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

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

Вопрос

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

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

  1. Найдите собственные значения простой матрицы Хюккеля.
  2. Удалить дубликаты и определить размер списка.
  3. Оцените количество вырожденных, сравнивая дубликат списка с бездаковым списком.
  4. Создайте 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}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top