斜体文字描述了我的总体目标,如果有人感兴趣的话。问题在下面。
我试图使用Mathematica 8绘制简单分子的能量水平。我的方法很粗糙,并且如下所示:
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 []两次。
答案 0 :(得分:3)
m = {{1, 2}, {3, 1}, {-1, 1}}
max = Max[m[[All, 2]]]
因此找到max的位置并用第一列替换第二列:
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[...]
,也可以保留结果列表,以涵盖列中最多值出现多次的情况。
答案 1 :(得分:2)
内部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]]
答案 2 :(得分:2)
如果在第二列中重复最大值的情况下,您只需要一个列一个值,我建议您使用Ordering
:
m = {{1, 3}, {1, 8}, {5, 7}, {2, 2}, {1, 9}, {4, 9}, {5, 6}};
m[[ Ordering[m[[All, 2]], -1], 1 ]]
{4}