comp.lang.idl-pvwave archive
Messages from Usenet group comp.lang.idl-pvwave, compiled by Paulo Penteado

Home » Public Forums » archive » Convolution of Stick Spectra
Show: Today's Messages :: Show Polls :: Message Navigator
E-mail to friend 
Return to the default flat view Create a new topic Submit Reply
Re: Convolution of Stick Spectra [message #21741 is a reply to message #21722] Sun, 17 September 2000 00:00 Go to previous messageGo to previous message
mole6e23 is currently offline  mole6e23
Messages: 31
Registered: December 1998
Member
craigmnet@cow.physics.wisc.edu wrote:

> After looking at your problem it looks like the widths of the lines
> are as wide as your energy range. I guess this would be appropriate
> [snip..]
> so many exponentiations. You could have gotten a pretty big savings
> if the lines were narrow, and you could restrict the computation to a
> narrow region around the line center (say +/- 10 sigma with WHERE). I
> recommend that anyway to get rid of underflow errors.
> [snip..]
> If for example your sigma term were
> (((.12*sqrt(stick[0,i]/1000))/1.6651)*10) [ note the last factor is
> smaller ] then things start to look interesting.

That's because there's always a danger in taking code x and modifying it
into simpler example y! As you suggested, I actually DO have a sigma term
with a *10 instead of a *1000.

I did what you suggested with the +/- 10*sigma with where (code below),
and it drastically improved running time. For the 5000 element array, the
running time went from 62.3 seconds to 4.9 seconds! I plot the error
associated with the method, and I was actually able to go down to +/-
4*sigma before there was any noticable error.

Thanks!
Todd

--

pro test

convoluted = fltarr( 2, 2048 )
convoluted[0,*] = findgen( 2048 ) / 2047. * 4.
convoluted2 = convoluted

;; Let's fake a stick spectrum, we usually have at least this many elements
stick = abs(randomn(10, 2, 5000 ))
stick[0,*] = stick[0,*] * 4.
stick[1,*] = stick[1,*] * 1000.

time=systime(1)
for i=0L, n_elements( stick ) / 2 -1 do $
convoluted[1,*] = stick[1,i]*exp(-((convoluted[0,*] - stick[0,i])^2)/ $
(((.12*sqrt(stick[0,i]/1000))/1.6651)*10)^2) $
+ convoluted[1,*]

time2 = systime(1)
for i=0L, n_elements( stick ) / 2 -1 do begin
;; Find range
sigma = (((.12*sqrt(stick[0,i]/1000))/1.6651)*10)
range = where( convoluted2[0,*] ge (stick[0,i]-4*sigma) and $
convoluted2[0,*] le (stick[0,i]+4*sigma) )

if( range[0] ne -1 ) then $
convoluted2[1,range] = stick[1,i]*exp(-((convoluted2[0,range] - $
stick[0,i])^2)/sigma^2) $
+ convoluted2[1,range]
endfor

print, 'time old: ', time2-time
print, 'time new: ', systime(1)-time2

new = convoluted
new[1,*] = new[1,*] - convoluted2[1,*]

plot,new[0,*], new[1,*],yrange=[-10,10]

end ;; test
[Message index]
 
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Previous Topic: cw_defroi for true color displays
Next Topic: Re: object graphic / direct graphic

-=] Back to Top [=-
[ Syndicate this forum (XML) ] [ RSS ] [ PDF ]

Current Time: Wed Oct 08 19:59:34 PDT 2025

Total time taken to generate the page: 0.00446 seconds