这个问题是上一个线程的延续,用于比较具有相同长度的两个列表:
Is there any efficient easy way to compare two lists with the same length with Mathematica?
给定两个列表 A={a1,a2,a3,...an}
和 B={b1,b2,b3,...bn}
,当且仅当所有 ai>=bi
时,我会说 A>=B
。现在我们有 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、长度[H]}];h
有什么更好的技巧吗?
编辑:
我想将其定义为如下函数:
maxList[H_]:=Do[If[NonNegative[Min[H[[i]] - h]], h = H[[i]], ## &[]], {i, h = H[[1]]; 1、长度[H]}];h
但问题是上面的代码跨了两行,有什么办法解决这个问题吗?这是一些可以工作但不是那么漂亮的代码
maxList[H_] := Module[{h = H[[1]]}, Do[If[NonNegative[Min[H[[i]] - h]], h = H[[i ]], ## &[]], {i, 长度[H]}]; h]
或
maxList[H_]:=Last[Table[If[NonNegative[Min[H[[i]] - h]], h = H[[i]], ## &[]], { i, h = H[[1]]; 1、长度[H]}]]
最佳答案
在我看来,这应该可行:
maxList = # \[Intersection] {Max /@ Transpose@#} &;
maxList[ {{4, 5, 6}, {1, 4, 3}, {4, 3, 5}, {5, 6, 7}} ]
{{5, 6, 7}}
我没有考虑使用 Intersection
的成本,Artes 表明 MemberQ
是一个更好的选择。 (请像我一样投票给他的答案)。我自己会在不使用 Module
的情况下编写函数:
maxList[a_] := If[MemberQ[a, #], #, {}] &[Max /@ Transpose@a]
一个几乎等价但不是相当的快速方法是这样的:
maxList = Cases[#, Max /@ Transpose@# , 1, 1] &;
结果的格式为 {{a, b, c}}
或 {}
而不是 {a, b, c}
或 {}
。
关于arrays - 使用 Mathematica 在具有相同长度的 N 个列表中找到最大列表的任何有效简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8889583/