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]}]]
在我看来,这应该工作:
maxList = # \[Intersection] {Max /@ Transpose@#} &;
maxList[ {{4, 5, 6}, {1, 4, 3}, {4, 3, 5}, {5, 6, 7}} ]
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud){{5, 6, 7}}
我没有考虑使用成本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}或{}.