Re: Greatest element in list
- To: mathgroup at smc.vnet.net
- Subject: [mg30594] Re: Greatest element in list
- From: rknapp at wolfram.com
- Date: Thu, 30 Aug 2001 03:51:44 -0400 (EDT)
- Organization: Wolfram Research, Inc.
- References: <9m27in$gqd$1@smc.vnet.net> <9m5267$qe0$1@smc.vnet.net> <9m6tvk$l99$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Ordering is certainly the fastest solution and it appears to have the additional benefit of always giving a result, but care should be taken since it DOES NOT necessarily order along the real line. First, consider In[1]:= list = {1, Pi, 4, 3 + 4 I}; In[2]:=Position[#, Max[#]]&[list] Max::nord: Invalid comparison with 3 + 4 I attempted. Max::nord: Invalid comparison with 3 + 4 I attempted. Out[2]= {} returns empty because, as the message has indicated, the complexes do not have a clearly defined order, so ,... In[3]:= Max[list] Max::nord: Invalid comparison with 3 + 4 I attempted. Max::nord: Invalid comparison with 3 + 4 I attempted. Out[3]= Max[3 + 4 I, 4] Max cannot return a number. What is more interesting is when we try this example with Ordering In[4]:= First[Ordering[list, -1]] Out[4]= 2 Which is the position of Pi. The trick is that Ordering uses Mathematica's default Sort ordering, which ranks symbols (whether they have numeric values or not) differently from numbers: In[5]:= Sort[list] Out[5]= {1, 3 + 4 I, 4, Pi} Allan Hayes wrote: > > Jens, > Your function MaxPosition seems to be nearly twice as fast as > Position[lst,{1},1] unless a maximum entry comes very early in the list > (much of the speed seems to be due to the compiling). > Howevver the new function Ordering is over ten times faster. > > MaxPosition= (*Jens-Peer Kuska*) > Compile[{{lst,_Real,1}}, > Module[{max=First[lst],pos=1,i=2}, > Scan[If[#>max,max=#;pos=i++,i++]&,Rest[lst]]; > pos]]; > > MaxPosition2[lst_]:= (*uncompiled version of above*) > Module[{max=First[lst],pos=1,i=2}, > Scan[If[#>max,max=#;pos=i++,i++]&,Rest[lst]]; > pos]; > > TIMINGS > > lst=Insert[Table[Random[],{100000}],2.0,50000]; > > Timing[Position[#,Max[#]]&[lst]] > > {1.43 Second,{{50000}}} > > Timing[Position[#,Max[#],{1},1]&[lst]] > > {1.15 Second,{{50000}}} > > MaxPosition[lst]//Timing > > {0.66 Second,50000} > > Timing[MaxPosition[lst]] > > {7.2 Second,714995} > > Timing[MaxPosition2[lst]] > > {24.45 Second,50000} > > Ordering[lst,-1]//Timing > > {0.11 Second,{50000}} > > -- > Allan > --------------------- > Allan Hayes > Mathematica Training and Consulting > Leicester UK > www.haystack.demon.co.uk > hay at haystack.demon.co.uk > Voice: +44 (0)116 271 4198 > Fax: +44 (0)870 164 0565 > > "Jens-Peer Kuska" <kuska at informatik.uni-leipzig.de> wrote in message > news:9m5267$qe0$1 at smc.vnet.net... > > Hi, > > > > without your data I can't reproduce the problem. > > But > > > > MaxPosition = Compile[{{lst, _Real, 1}}, Module[{max = First[lst], pos = > > 1, i = 2}, > > Scan[ > > If[# > max, max = #; pos = i++, i++] & , > > Rest[lst] > > ]; > > pos > > ] > > ] > > > > is atleast faster than Position[#, Max[#]] &[lst] > > > > In[]:=lst = Table[Random[], {1000000}]; > > > > In[]:=Timing[Position[#, Max[#]] &[lst]] > > Out[]={6.85 Second, {{602020}}} > > > > In[]:=Timing[MaxPosition[lst]] > > Out[]={4.42 Second, 602020} > > > > Because it scans the list only once. > > > > Regards > > Jens > > > > > > Oliver Friedrich wrote: > > > > > > Hi, > > > > > > what's the best way to get the position of the greatest number in list > of > > > reals? I've tried > > > > > > Position[#,Max[#]]&list > > > > > > but surprisingly, it doesn't work all the time, sometimes it returns an > > > empty list. How is that, because a theorem says that a non empty set of > real > > > numbers must have at least one biggest element. So Max[#] can't be > empty. > > > > > > Any solutions ? > > > > > > Oliver Friedrich > >