Re: Re: How to find the index of a maximal element in a list?
- To: mathgroup at smc.vnet.net
- Subject: [mg72971] Re: [mg72958] Re: How to find the index of a maximal element in a list?
- From: János <janos.lobb at yale.edu>
- Date: Sat, 27 Jan 2007 05:33:36 -0500 (EST)
- References: <epa2rr$iue$1@smc.vnet.net> <200701261218.HAA09922@smc.vnet.net>
On Jan 26, 2007, at 7:18 AM, Peter Pein wrote:
> Valter Sorana schrieb:
>> I may have a mental block, but I cannot find anything better than
>>
>> Position[listName,Max[listName]]
>>
>> that traverses the list twice - once to find the maximum and once
>> to find where it is.
>>
>> Isn't there a way to get both the index and the max value in one go?
>>
>> (of course one could write a loop that does this, but I want to
>> avoid loops)
>>
>> Thanks,
>>
>> Valter.
>>
>
> Hi Valter,
>
> if your data is in the range which can be handled by compiled
> functions, you
> might want to try a compiled Scan[].
>
> testit[f_, r_: {3,7}]:=
> (SeedRandom[13];
> ((data=Table[Random[],{10^#1}];Timing[f[data]])&)/@(Range@@r));
>
> testit[Position[#,Max[#],1,1][[1,1]]&]
> Out[2]=
> {{0. Second, 243},
> {0. Second, 5935},
> {0.062 Second, 72435},
> {0.312 Second, 238526},
> {6.797 Second, 5922868}}
>
> This came to my mind, but it sorts the indices of the list and runs
> longer:
>
> testit[Last[Ordering[#]]&]
>
> {{0. Second, 243},
> {0. Second, 5935},
> {0.046 Second, 72435},
> {0.625 Second, 238526},
> {9.172 Second, 5922868}}
>
> My suggestion:
>
> testit[Compile[{{lst,_Real,1}},
> Module[{mx=First[lst],ix=0,n=1},
> Scan[(If[#>mx,mx=#;ix=n];n++)&,Rest[lst]];
> ix],
> {{mx,_Real},{ix|n,_Integer}}]]
>
> {{0. Second, 242},
> {0. Second, 5934},
> {0.031 Second, 72434},
> {0.281 Second, 238525},
> {2.828 Second, 5922867}}
>
> But do not try it uncompiled:
>
> testit[Module[{mx=First[#],ix=1,n=1},
> Scan[(If[#>mx,mx=#;ix=n];n++)&,Rest[#]]; ix]&]
>
> {{ 0.015 Second, 242},
> { 0.047 Second, 5934},
> { 0.453 Second, 72434},
> { 4.469 Second, 238525},
> {45.484 Second, 5922867}}
>
> hth,
> Peter
Now that begs the newbie question; if WRI should always probe what
parts of a program should be run as compiled. I can imagine a "meta
parser" that invoked after you hit shift+command or select "evaluate
notebook" and wraps with Compile every part of the notebook that the
meta parser think it can be run as compiled.
Am I dreaming... or what ?
János
----------------------------------------------
Trying to argue with a politician is like lifting up the head of a
corpse.
(S. Lem: His Master Voice)
- References:
- Re: How to find the index of a maximal element in a list?
- From: Peter Pein <petsie@dordos.net>
- Re: How to find the index of a maximal element in a list?