This question is a continuation of a previous thread to compare two lists with the same length:
Is there any efficient easy way to compare two lists with the same length with Mathematica?
Given two lists A={a1,a2,a3,...an}
and B={b1,b2,b3,...bn}
, I would say A>=B
if and only if all ai>=bi
. Now we have k
lists H={{a11,a12,a13,...a1n}, {a21,a22,a23,...a2n},...,{ak1,ak2,ak3,...akn}}
, and want to find the maximum one if exist.
Here's my code:
Do[If[NonNegative[Min[H[[i]] - h]], h = H[[i]], ## &[]], {i, h = H[[1]]; 1, Length[H]}];h
Any better trick to do this?
EDIT:
I want to define this as a function like:
maxList[H_]:=Do[If[NonNegative[Min[H[[i]] - h]], h = H[[i]], ## &[]], {i, h = H[[1]]; 1, Length[H]}];h
But the question is the code above cross two lines, any fix for this? Here is some code working but not that beautiful
maxList[H_] := Module[{h = H[[1]]}, Do[If[NonNegative[Min[H[[i]] - h]], h = H[[i]], ## &[]], {i, Length[H]}]; h]
or
maxList[H_]:=Last[Table[If[NonNegative[Min[H[[i]] - h]], h = H[[i]], ## &[]], {i, h = H[[1]]; 1, Length[H]}]]
Some Data: Btw, it's not actually necessary to label the individual sublists. I did so for easy reference.
maxList determines whether a sublist is a greatest list, i.e. whether each of its elements is greater than the respective elements in all other sublists. We initially assume that a sublist is a maximal list. If that assumption is violated (note the use of
Negative
rather thanNonNegative
) False is returned. BTW, a list will be compared to itself; that's easier than removing it fromlists
; and it doesn't affect the result.Now let's check whether one of the above sublists is a maxList:
Sublist d is a maxList.
If there were no maxList, the result would have been the empty list.
It seems to me that this should work:
I did not think about the cost of using
Intersection
, and Artes shows thatMemberQ
is a much better choice. (Please vote for his answer as I did). I would write the function without usingModule
myself:A nearly equivalent though not quite as fast method is this:
The result is in the form
{{a, b, c}}
or{}
rather than{a, b, c}
or{}
.A modification of Mr.Wizard's approach works a few times faster.
We test the both methods with
and we get
and
EDIT
In general, to choose a method, we should know first what kind of data we are to deal with. (lenght of lists, their number, types of numbers ). While we have a large number of short lists of integers
maxListFast
works even 10 times better (in case of 500000 lists of length 10) thanmaxList
. However for lists of real numbers it is only 3-4 times faster, and the more and the longer list we have the more it slows down, e.g. :however if we insert "the greatest element" :
timings close up.