在Mathematica中搜索矩阵8 - 尝试在与X相同的行上查找其他元素

时间:2012-01-11 04:49:03

标签: math wolfram-mathematica physics chemistry

斜体文字描述了我的总体目标,如果有人感兴趣的话。问题在下面。

我试图使用Mathematica 8绘制简单分子的能量水平。我的方法很粗糙,并且如下所示:

  1. 查找简单Hückel矩阵的特征值。
  2. 删除重复项并确定列表大小。
  3. 通过比较重复列表和无重复列表来评估退化数量。
  4. 创建一个n x 2零矩阵,其中n是唯一能级的数量。
  5. 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 []两次。

3 个答案:

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