1

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

我正在尝试使用 Mathematica 8 绘制简单分子的能级。我的方法很粗糙,如下所示:

  1. 求简单 Hückel 矩阵的特征值。
  2. 删除重复项并确定列表的大小。
  3. 通过比较重复列表和无重复列表来评估退化的数量。
  4. 创建 anx 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[] 两次。

4

3 回答 3

3
m = {{1, 2}, {3, 1}, {-1, 1}}
max = Max[m[[All, 2]]]

所以找到最大值的位置并将第二列替换为第一列:

pos=Position[m, max] /. {x_,_}:>{x,1}
{{1,1}}

然后从 pos 中取出第一个元素,即 {1,1} 并 sub 使用它Part

m[[Sequence @@ First[pos]]]
1

但话虽如此,我更喜欢这样的东西:

Cases[m, {x_, max} :> x]
{1}

结果是一个列表。您可以使用First@Cases[...]或者您可能希望保留一个结果列表,以涵盖最大值在列中多次出现的情况。

于 2012-01-11T05:24:16.853 回答
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]]
于 2012-01-11T05:15:09.477 回答
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}
于 2012-01-12T11:27:08.093 回答