Re: message 50001?
- To: mathgroup at smc.vnet.net
- Subject: [mg50045] Re: [mg50001] message 50001?
- From: "Dr A.H. Harker" <a.harker at ucl.ac.uk>
- Date: Thu, 12 Aug 2004 05:45:01 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
Dear Rob,
As ever, there's a balance to be struck between elegance and
efficiency. One can invent all sorts of fancy code that "hides" loops,
but in the end it's worth considering how many passes through the data
are required to obtain the result. Presumably Max makes one complete
pass through the array, and the For loop makes another, so the number of
operations scales like n, the number of entries in the list (when I say
"scales like", I mean it's proportional to n, not to some power of n).
Anything involving a new list with the entries and their original
positions, sorted, would scale like n log(n), so would probably be
slower.
In a few trials (1000 trials each of 1000-long lists of random data:
the details change with different lengths, but I don't think the
orderings do), I found that
For[i = 1, S[[i]] != Max[S], i++, x == len]
was very slow, and despite the rebuilding of the list and the full sort
Sort[Transpose[{S, Range[Length[S]]}]][[-1, 2]]
was about twice as fast
Position[S, Max[S]][[1, 1]]
cut the time by another factor of 5, but the out-and-out winner, at
least ten times as fast again, was
Ordering[S, -1][[1]]
I can only assume that Ordering has special cases built into it to
handle a search for the maximum or minimum, as it rapidly slows if one
asks for the positions of items which would be further from the end of
the sorted list.
When I started playing with this, I'd assumed, on the basis of my
first paragraph, that
Position[S, Max[S]][[1, 1]]
would be fastest. I was wrong!
Tony Harker (Dr A.H. Harker)
Director of Postgraduate Studies
Deputy Head, Condensed Matter and Materials Physics Group
Department of Physics and Astronomy
University College London
Gower Street
LONDON
WC1E 6BT
(44)(0)207 679 3404
a.harker at ucl.ac.uk
]->-----Original Message-----
]->From: 1.156 [mailto:rob at pio-vere.com]
To: mathgroup at smc.vnet.net
]->Sent: 11 August 2004 10:53
]->To: mathgroup at smc.vnet.net
]->Subject: [mg50045] [mg50001] message 50001?
]->
]->Mathematica wizards, I've managed to cripple together code to do
]->something that
]->I feel must be doable more easily and/or faster.
]->
]->S is a list of reals containing a signal with a prominent peak in
]->amplitude. I simply want to find the index of the peak (x, the number
of
]->entries into the list where the peak occurs). Here's what I did.
]->
]->
]->For[i = 1, S[[i]] ? max[S], i++, x = i];
]->
]->Can some suggest a better way, especially one not using a For loop?
]->
]->Thanks, Rob