Services & Resources / Wolfram Forums
-----
 /
MathGroup Archive
2004
*January
*February
*March
*April
*May
*June
*July
*August
*September
*October
*November
*December
*Archive Index
*Ask about this page
*Print this page
*Give us feedback
*Sign up for the Wolfram Insider

MathGroup Archive 2004

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Label of Max[list]

  • To: mathgroup at smc.vnet.net
  • Subject: [mg50226] Re: Label of Max[list]
  • From: Bill Rowe <readnewsciv at earthlink.net>
  • Date: Sat, 21 Aug 2004 03:04:40 -0400 (EDT)
  • Sender: owner-wri-mathgroup at wolfram.com

On 8/20/04 at 4:57 AM, drbob at bigfoot.com (DrBob) wrote:

>wehMax[li_] := {m = Max[li], Select[Range[Length[li]], li[[#1]] == m & ]}
>myLabelMax[data_] :=
>   Module[{max = Max[data]}, {max, Flatten[Position[data, max]]}]

>test[n_] := Module[
>    {data = RandomArray[BinomialDistribution[10, 0.3], {n}], one, two},
>    one = Timing[wehMax[data]];
>    two = Timing[myLabelMax[data]];
>   {First[one], First[two], Last[one] == Last[two]}]

>test[1000000]
>{1.5779999999999994*Second, 0.09299999999999997*Second, True}

>That's a timing for your method, then mine, and a test to see if
>they got the same answer.

If it is speed you are after consider

labelMax[data_] := 
  ({data[[#1[[1]]]], #1} & )[Ordering[data, -1]]
  

test[n_] := Module[
   {data = Table[Random[], {n}], one, two}, 
   one = Timing[labelMax[data]]; 
   two = Timing[myLabelMax[data]]; 
   {First[one], First[two], Last[one] == Last[two]}]
   
test[1000000]
{0.03999999999999915*Second, 1.3100000000000023*Second, True}

Note, I changed your test program to use a uniform distribution of reals rather than a binomial distribution of integers for two reasons. First, generating a million uniform reals requires less time then generating a million binomial integers. Second, it is very likely the maximum of a million uniform reals is a unique value in that set. If the maximum value is not unique then the two methods will not give the same result.

Flatten@Position[data,Max@data] will return an ordered lists of all indices where Max@data occurs

Ordering[data, -1] will return a one element list containing the position of the last occurance of Max@data

Your method will get the same results as the method used by the OP. It isn't clear whether the OP considered duplicate maximum values or not.

--
To reply via email subtract one hundred and four


  • Prev by Date: Re: Beware of NSolve - nastier example
  • Next by Date: Re: Beware of NSolve - nastier example
  • Previous by thread: Re: Label of Max[list]
  • Next by thread: Hypergeometric function