使用Mathematica在N个列表中查找具有相同长度的最大列表的任何有效简便方法?

Osi*_* Xu 2 arrays wolfram-mathematica list mathematica-8

这个问题是前一个线程的延续,用于比较具有相同长度的两个列表:

有没有有效的简单方法来比较Mathematica相同长度的两个列表?

鉴于两个列表A={a1,a2,a3,...an}B={b1,b2,b3,...bn},我会说A>=B,当且仅当所有ai>=bi.现在我们有了k列表H={{a11,a12,a13,...a1n}, {a21,a22,a23,...a2n},...,{ak1,ak2,ak3,...akn}},并希望找到最大的列表(如果存在).

这是我的代码:

Do[If[NonNegative[Min[H[[i]] - h]], h = H[[i]], ## &[]], {i, h = H[[1]]; 1, Length[H]}];h

有没有更好的技巧呢?

编辑:

我想将其定义为以下函数:

maxList[H_]:=Do[If[NonNegative[Min[H[[i]] - h]], h = H[[i]], ## &[]], {i, h = H[[1]]; 1, Length[H]}];h

但问题是上面的代码跨越两行,对此有什么解决方法吗?这里有一些代码工作,但不是很漂亮

maxList[H_] := Module[{h = H[[1]]}, Do[If[NonNegative[Min[H[[i]] - h]], h = H[[i]], ## &[]], {i, Length[H]}]; h]

要么

maxList[H_]:=Last[Table[If[NonNegative[Min[H[[i]] - h]], h = H[[i]], ## &[]], {i, h = H[[1]]; 1, Length[H]}]]

Mr.*_*ard 5

在我看来,这应该工作:

maxList = # \[Intersection] {Max /@ Transpose@#} &;

maxList[ {{4, 5, 6}, {1, 4, 3}, {4, 3, 5}, {5, 6, 7}} ]
Run Code Online (Sandbox Code Playgroud)
{{5, 6, 7}}
Run Code Online (Sandbox Code Playgroud)

我没有考虑使用成本Intersection,Artes表示这MemberQ是一个更好的选择.(请像我一样投票给他答案).我会在不使用Module自己的情况下编写函数:

maxList[a_] := If[MemberQ[a, #], #, {}] &[Max /@ Transpose@a]
Run Code Online (Sandbox Code Playgroud)

一个几乎等同虽然不是非常快的方法是这样的:

maxList = Cases[#, Max /@ Transpose@# , 1, 1] &;
Run Code Online (Sandbox Code Playgroud)

结果是形式{{a, b, c}}{}而不是{a, b, c}{}.

  • 使用`Max/@`代替`Last/@ Sort/@`会更有效率. (2认同)