MathGroup Archive 2010

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

Search the Archive

Re: <Null> while building lists

  • To: mathgroup at smc.vnet.net
  • Subject: [mg112207] Re: <Null> while building lists
  • From: Albert Retey <awnl at gmx-topmail.de>
  • Date: Sat, 4 Sep 2010 04:02:57 -0400 (EDT)
  • References: <i5qhfr$pio$1@smc.vnet.net>

Am 03.09.2010 12:08, schrieb Alessandro:
> Hi group,
> I'm sure I'll bang me on my head as soon as I will Press <Post
> Message>,
> but it's since yesterday that I'm struggling with this...
> 
> I fast defined this awkward function, to collect the {index,value} of
> the maxima of a list of reals (a Fourier transform):
> 
> maxima[f_] := Block[{old = f[[1]], m = {}},
>   For[i = 2, i < Length[f]/2, i++,
>     If[f[[i]] > old && f[[i + 1]] < f[[i]],
>      AppendTo[m, {i, f[[i]]}]];
>     old = f[[i]]
>     ]
>    m
>   ]
> 
> Problem is, what I get is e.g. this:
> 
>> maxima[f]
>> {{14 Null, 10.8853 Null}, {21 Null, 3.34261 Null}, {28 Null, 1.47219 Null}}
> 
> I'm sure I do not have spaces anywhere (it happened something similar
> due to this error, time ago),
> so what's wrong?

basically I think you are just missing a ; after the For. On the other
hand, I think it is 'wrong' to use a For and AppendTo for that problem:
it is the most error prone and inefficient way to solve your problem in
mathematica... (is it by purpose that you only look at the first half of
your list?). Here are two alternatives, I'm sure there are even clearer
and more efficient variants...

findmaxima1[lst_] := Reap[
    Do[
      If[lst[[i - 1]] < lst[[i]] > lst[[i + 1]],
       Sow[{i, lst[[i]]}]], {i, 2, Length[lst] - 1}
      ];
    ][[2, 1]];

findmaxima2[lst_] := Map[
  {#, lst[[#]]} &,
  Flatten[Position[Differences[lst, 2], _?Negative]] + 1
  ]


hth,

albert


  • Prev by Date: Re: <Null> while building lists
  • Next by Date: Re: FindRoots?
  • Previous by thread: Re: <Null> while building lists
  • Next by thread: Re: <Null> while building lists