Re: <Null> while building lists
- To: mathgroup at smc.vnet.net
- Subject: [mg112188] Re: <Null> while building lists
- From: Raffy <adraffy at gmail.com>
- Date: Sat, 4 Sep 2010 03:59:29 -0400 (EDT)
- References: <i5qhfr$pio$1@smc.vnet.net>
On Sep 3, 3:08 am, Alessandro <alexxx.ma... at gmail.com> wrote: > 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 Nu= ll}} > > I'm sure I do not have spaces anywhere (it happened something similar > due to this error, time ago), > so what's wrong? > > thanks for any help... > > alessandro Your For[] loop returns Null which is getting multiplied by variable m ("...] m" vs "]; m"). Here's a version of your function where the search is compiled (worked for a single vector of machine reals). With[{f = Compile[{{v, _Real, 1}}, Module[{max = v[[1]], cur = v[[2]], nxt}, Do[nxt = v[[i + 1]]; If[cur > max && cur > nxt, Sow@{i, cur}; max = cur]; cur = nxt, {i, 2, Quotient[Length[v], 2]}] ]]}, ClearAll[maxima]; maxima[_] = {}; maxima[v_List /; Length[v] > 2 && VectorQ[v, NumericQ]] := Join @@ Last@Reap@f[v]; ];