Re: Avoiding a for cicle [message #19631 is a reply to message #19627] |
Tue, 11 April 2000 00:00   |
John-David T. Smith
Messages: 384 Registered: January 2000
|
Senior Member |
|
|
Craig Markwardt wrote:
>
> Benno Puetz <puetz@mpipsykl.mpg.de> writes:
>> "J.D. Smith" wrote:
>>> Ricardo Fonseca wrote:
>>>>
>>>> Hi
>>>>
>>>> I'm looking for a more efficient way of implementing the following (i.e.
>>>> avoiding the for cycle) which is a routine for finding local maximuns
>>>>
> ...
>>>> for i = 1, nx-1 do $
>>>> if ((Data[i] gt Data[i-1]) and (Data[i] gt Data[i+1])) then $
>>>> max_pos = [[max_pos],i]
>>>>
>>>> ; and then throw away the first element...
>>>
>>> max_pos = where(data gt median(data,3))
>>>
>>
>> While this is rather efficient concerning code length,
>>
>>
>> maxpos = WHERE(TEMPORARY(data[0:nx-3]) LT TEMPORARY(data[1:nx-2]) AND $
>>
>> TEMPORARY(data[1:nx-2]) GT TEMPORARY(data[2:nx-1])) + 1
>>
>> should execute faster, especially for longer arrays
>
> And the code-shortened version of this is:
>
> maxpos = where((data LT data(1:*)) AND (data(1:*) GT data(2:*))) + 1
>
> There are two key things to note here. First, TEMPORARY is not needed
> when you are indexing an array, since subscripted array expressions
> are already considered temporary. Second, IDL automatically truncates
> 1-D arrays in binary operations. So, the finite difference expression
> normally written like this:
>
> diff = data(1:nx-1) - data(0:nx-2)
>
> can be written like this:
>
> diff = data(1:*) - data
>
> The two data arrays are of different length, so IDL takes the shortest
> of each. Saves some keystrokes, and the calculation of NX.
>
Alright code slingers... new challenge... find location of all peaks in a region
of n points (n odd), monotonically decreasing away from the peak. I.e. find
peaks of width n.
e.g. an n=5 peak:
-
- -
- -
I'll reserve my entry until I see the contenders. Points are awarded for
unusual use of obscure IDL functions, brevity, style, lip synch, and
congeniality.
JD
--
J.D. Smith |*| WORK: (607) 255-5842
Cornell University Dept. of Astronomy |*| (607) 255-6263
304 Space Sciences Bldg. |*| FAX: (607) 255-5875
Ithaca, NY 14853 |*|
|
|
|