[Thread Prev][Thread Next][Index]

Slow Calculation Speed - Can it be Faster?

I have written a routine to calculate the correlation coefficient between two
data series (code attached below). I can understand why some of the first
calculations are slow, but once the values are calculated once, it appear that
everytime they are referenced after that they are calculated all over again. Is
there a way to prevent this?

My calling routine is:
   use "TS01/TS01dt"
   use "TS20/TS20dt"
   let qc1=qcdt[d=1]
   let tqa1=qc1-qc1[i=@ave]   ! remove mean
   let tqs1=tqa1[l=@ave]      ! average longitudinal profile
   let tqn1=tqs1/0.00021232   ! normalize by standard deviation
   let qc2=qcdt[d=2]
   let tqa2=qc2-qc2[i=@ave]
   let tqs2=tqa2[l=@ave]
   let tqn2=tqs2/0.00011629
   go xcorrel tqn1 tqn2

   let/quiet Xi = $1
   let/quiet Yi = $2
   let/quiet XiYi = Xi*Yi
   let/quiet Xi2 = Xi*Xi
   let/quiet Yi2 = Yi*Yi
   let/quiet sXiYi = XiYi[i=@sum]
   let/quiet sXi2 = Xi2[i=@sum]
   let/quiet sYi2 = Yi2[i=@sum]
   let/quiet mX = Xi[i=@ave]
   let/quiet mY = Yi[i=@ave]
   let/quiet nX = Xi[i=@NGD]
   let/quiet eN = $3%nX%
   list sXiYi, sXi2, SYi2, mX, mY, nX, eN
   let/quiet sX2 = sXi2-nX*mX*mX
   let/quiet sY2 = sYi2-nX*mY*mY
   list sX2, sY2
   let/quiet rXY = (sXiYi-nX*mX*mY)/(sX2*sY2)^0.5
   list rXY                                        ! *** 1 ***
   let/quiet w = 0.5*LN((1+rXY)/(1-rXY))
   list w                                          ! *** 2 ***
   let/quiet signif = w*(eN-3)^0.5
   list signif

First, I realize that in this particular case that since I have removed the
mean and normalized by the standard deviation so that my correlation function
be greatly simplified, but I wanted the routine to be more general.  In the
future I will likely add some flag that will indicate that I am using
 normalized anomaly series and thus run simplified code. Right now I am trying
to understand a more general principle. In particular, in XCORREL.JNL at the
line indicated by the comment *** 1 *** all the values used to calculate rXY
have already been calculated once before (in the list statements), but it still
takes a long time to calculate. Furthermore, at the line in XCORREL.JNL
indicated by the comment *** 2 ***, Rxy has already been calculated - but w
takes forever to calculate.

I tried inserting load/perm statements before the list statements to hopefully
get around this. Nope, the list statements took just as long so obviously the
load/perm statements didn't do what I hoped.

Lastly, I tried simplifying my calling routine to:
   use "TS01/TS01dt"
   use "TS20/TS20dt"
   let tqs1=qc[d=1,l=@ave]  ! average longitudinal profile
   let tqs2=qc[d=2,l=@ave]  ! average longitudinal profile
   go xcorrel tqs1 tqs2

This worked very quickly, so it must have something to do with the mutliple
definitions in my calling routine. But I am not sure how to work around this.
Any help would be appreciated!

	Thanks, Mark


	      Mark Verschell (verschell@coaps.fsu.edu)
	      Center for Ocean and Atmospheric Prediction Studies
	      Florida State University
              2035 E. Paul Dirac Drive
              R.M. Johnson Bldg. - Suite 200
	      Tallahassee, FL  32306-3041
	      (904) 644-6532              (904) 644-4841 (fax)

[Thread Prev][Thread Next][Index]

Dept of Commerce / NOAA / OAR / PMEL / TMAP

Contact Us | Privacy Policy | Disclaimer | Accessibility Statement