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

Home » Public Forums » archive » Re: Expensive loops... can they be avoided?
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: Expensive loops... can they be avoided? [message #58904 is a reply to message #58891] Tue, 26 February 2008 06:15 Go to previous messageGo to previous message
Allan Whiteford is currently offline  Allan Whiteford
Messages: 117
Registered: June 2006
Senior Member
Rainer,

Not using even a remotely similar algorithm (and one which might be
inadequate for your purposes) but how about:

xp=transpose(rebin(r,n_elements(r),n_elements(chi))) * $
rebin(cos(chi),n_elements(chi),n_elements(r))
yp=transpose(rebin(r,n_elements(r),n_elements(chi))) *
rebin(sin(chi),n_elements(chi),n_elements(r)) $
triangulate,xp,yp,tr
b=trigrid(xp,yp,transpose(a),tr,xout=x,yout=y)

this should be faster than your previous solution but, as I said, might
not be suitable. You can also save xp, yp and tr between calls if your
"a" data is changing but everything else is staying the same which will
also speed things up a bit.

Also, this solution might not work. I've only really checked it for
syntax errors not for accuracy or it even being the correct thing to do.
I've only ever used triangulate and friends for display purposes so
can't claim to be an expert on how accurate "b" will end up - since you
were just picking the nearest point before I guess you're not overly
concerned with accuracy.

The "missing" keyword to TRIGRID might handle your environment_value case.

Sorry for not answering your question as such but I hope this helps or
at least points you in a helpful direction.

Thanks,

Allan

Rainer wrote:
> Hi!
>
> I need to render 2D slices cut from 3D spherical grid data. So far, I
> am using a brute force method which, using two FOR loops, is
> unfortunately rather slow (although working just fine). The problem
> and my approach boil down to this:
>
> -- A[i,j] is the input array, with r[i] and chi[j] being curvilinear
> coordinates (not necessarily uniformly spaced)
> -- B[k,l] is the output array with x[l] and y[l] being uniformly
> spaced Cartesian coordinates (to be plotted with TVSCALE)
>
> for k=0,nx-1 do begin
> for l=0,ny-1 do begin
>
> curr = sqrt(x[k]^2+y[l]^2)
> curchi = atan(x[k],y[l])
>
> if "curchi or curr are out of bounds" then begin
> B[k,l] = environment_value
> continue
> endif
>
> foo = min( r - curr ,nearestr,/absolute)
> foo = min( chi - curchi ,nearestchi,/absolute)
>
> B[k,l] = A[nearestr,nearestchi]
>
> endfor
> endfor
>
>
> The calculation of "curr" and "curchi" can easily be done outside the
> loops of course. But what can I do with the rest?
>
>
> Thanks,
> Rainer
[Message index]
 
Read Message
Read Message
Read Message
Previous Topic: Re: Convenient IGRF in IDL
Next Topic: Re: using the WHERE function on a portion of an array

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

Current Time: Fri Oct 10 02:48:57 PDT 2025

Total time taken to generate the page: 0.95955 seconds