Mathematica 9 is now available
Services & Resources / Wolfram Forums / MathGroup Archive
-----

MathGroup Archive 2009

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

Search the Archive

Re: Problem with the 'if' command

  • To: mathgroup at smc.vnet.net
  • Subject: [mg96604] Re: [mg96578] Problem with the 'if' command
  • From: Bob Hanlon <hanlonr at cox.net>
  • Date: Tue, 17 Feb 2009 06:24:41 -0500 (EST)
  • Reply-to: hanlonr at cox.net

You are testing the wrong condition, also you must ensure that the list is sorted and that the input is a list.

newMedian[list_List] := Module[
  {len = Length[list], sortedList = Sort[list]},
  If[IntegerQ[len/2],
   (sortedList[[(len/2) + 1]] + sortedList[[len/2]])/2,
   sortedList[[(len + 1)/2]]]]

newMedian2[list_List] := Module[
  {len = Length[list], sortedList = Sort[list]},
  If[Mod[len, 2] == 0,
   (sortedList[[(len/2) + 1]] + sortedList[[len/2]])/2,
   sortedList[[(len + 1)/2]]]]

newMedian3[list_List] := Module[
  {len = Length[list], sortedList = Sort[list]},
  If[EvenQ[len],
   (sortedList[[(len/2) + 1]] + sortedList[[len/2]])/2,
   sortedList[[(len + 1)/2]]]]

a = Table[RandomInteger[{0, 1000}, {RandomInteger[{10, 20}]}],
   {10000}];

And @@ (newMedian[#] == newMedian2[#] == newMedian3[#] == Median[#] & /@ a)

True


Bob Hanlon

---- mathandpi <mathandpi at yahoo.com> wrote: 

=============
Hi everyone,
I'm a new Mathematica user so I may be missing something fairly obvious, but I'm having trouble with the 'if' command.
I'm writing a function that is supposed to return the median of a list (I know such a function already exists, but I need to create one myself).

What I have is:

newMedian[list_] := 
 If[Length[list]/2 == 0, 
  1/2*(list[[(Length[list]/2) + 1]] + list[[(Length[list])/2]])
  , list[[(Length[list] + 1)/2]]]

if the list has an off number of members (condition is false), it evaluates as expected.  If it's even, however,

newMedian[{1, 2, 3, 4}] returns:
Part::pspec: Part specification 5/2 is neither an integer nor a list of integers.

BUT

list={1,2,3,4};

1/2*(list[[(Length[list]/2) + 1]] + list[[(Length[list])/2]])
returns 5/2, as expected so that code is right.

It seems likes its actually evaluating the false part of the code (trying to find the 5/2'ith element in a list), even though the condition is true.

What's going on here?

Thanks



  • Prev by Date: weird interpolation issues
  • Next by Date: Re: Re: Mathematica, ARPACK and implicit matrices
  • Previous by thread: Re: Problem with the 'if' command
  • Next by thread: Mathematica Training in Amsterdam