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