Mathematica 8のマトリックスの検索 - xと同じ行で他の要素を見つけようとしています
-
26-10-2019 - |
質問
イタリック体のテキストは、誰かが興味を持っている場合、私の一般的な目標を説明しています。質問は下にあります。
Mathematica 8を使用して、単純な分子のエネルギーレベルをグラフ化しようとしています。私の方法は粗雑であり、次のようになります。
- 単純なヒューッケルマトリックスの固有値を見つけます。
- 複製を削除し、リストのサイズを決定します。
- 重複リストを非複雑なリストと比較することにより、縮退の数を評価します。
- nは一意のエネルギーレベルの数であるANX 2ゼロマトリックスを作成します。
5.最初の列を一意のエネルギーレベルで埋め、2番目の列を縮退します。
ステップ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]
うまくいきますが、わかりません どうして パート[]を2回使用する必要があります。
解決
内部 Part
最大の最初の発生を提供します。 Position
このような最大値を持つ要素が1つしかない場合でも、ポジションのリストを返します。
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]]
ただし、コードがよりうまく処理する必要があると思うことの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]]]
したがって、最大の位置を見つけて、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の最大値の重複の場合に1つの列のみが必要な場合、私はあなたが使用することをお勧めします Ordering
:
m = {{1, 3}, {1, 8}, {5, 7}, {2, 2}, {1, 9}, {4, 9}, {5, 6}};
m[[ Ordering[m[[All, 2]], -1], 1 ]]
{4}