Re: Re: Help with Speeding up a For loop

*To*: mathgroup at smc.vnet.net*Subject*: [mg98976] Re: [mg98916] Re: Help with Speeding up a For loop*From*: Darren Glosemeyer <darreng at wolfram.com>*Date*: Thu, 23 Apr 2009 06:41:45 -0400 (EDT)*References*: <gsivhv$9f6$1@smc.vnet.net> <200904220907.FAA13170@smc.vnet.net>

A smaller additional speedup can be had by using one call to RandomReal to get the normals, e.g. Resolution = RandomReal[NormalDistribution[0, Sigma], Length[Ideal]] + Ideal This uses the fact that if z follows NormalDistribution[0,sigma], mu+z follows NormalDistribution[mu,sigma]. This is more efficient because it is faster to get a bunch of random numbers in one call than to get them one at a time and the addition of Ideal is comparatively very fast. Darren Glosemeyer Wolfram Research dh wrote: > Hi Adam, > > first note that indices in Mathematica start at 1, not 0. > > Then I set the start value of Ideal and Resolution to an empty list. > > With this changes, your loop can be replaced by: > > > > Ideal = Pick[Eb1, > > Thread@Less[k, Re[(E0 - Eb1)^2*Sqrt[1 - m^2/(E0 - Eb1)^2]]] ]; > > Resolution = RandomReal[NormalDistribution[#, Sigma]] & /@ Ideal; > > > > For n=10^7, this takes 7.5 sec. > > Daniel > > > > Adam Dally wrote: > > >> I am using an Intel MacBook with OS X 10.5.6. >> > > > > >> I am trying to create 2 lists: "Ideal" and "Resolution". This is basically >> > > >> a "Monte Carlo Integration" technique. Ideal should simulate the curve. >> > > >> Resolution should simulate the curve convoluted with a normal distribution. >> > > >> I want to do this for n=10 000 000 or more, but it takes far too long right >> > > >> now. I can do n=100 000 in about 1 minute, but 1 000 000 takes more than an >> > > >> hour. I haven't waited long enough for 10 000 000 to finish (it has been 5 >> > > >> days). >> > > > > >> Thank you, >> > > >> Adam Dally >> > > > > >> Here is the code: >> > > > > >> ClearAll[E0, Eb1, m, DeltaE, Sigma, k, n, y3, Ideal, Resolution, i, >> > > >> normalizer, maxE, minE] >> > > >> Eb1 = 0; k = 0; n = 10000; E0 = 2470; m = 0.2; DeltaE = 50; Sigma = 5; maxE >> > > >> = E0 - m; minE = E0 - DeltaE; Resolution = {Eb1}; Ideal = {Eb1}; (*Setup >> > > >> all constants, lists and ranges*) >> > > > > >> Eb1 = RandomReal[{minE, maxE}, n]; (*create a list of 'n' random Eb1 >> > > >> values*) >> > > >> k = -RandomReal[TriangularDistribution[{-2470, 0}, -0.1], n]; (*create a >> > > >> list of 'n' random k values; triangle distribution gives more successful >> > > >> results*) >> > > > > >> For[i = 0, i < n, i++, >> > > > > >> If[k[[i]] < Re[(E0 - Eb1[[i]])^2*Sqrt[1 - m^2/(E0 - Eb1[[i]])^2]], (*check >> > > >> if the {k,Eb1} value is under the curve*) >> > > >> AppendTo[Ideal, Eb1[[i]]]; (*Keep events under curve in 'Ideal'*) >> > > >> y3 = Eb1[[i]]; (*cast element to a number*) >> > > >> Eb1[[i]] = RandomReal[NormalDistribution[y3, Sigma], 1]; (*choose a >> > > >> random number from a normal distribution about that point*) >> > > >> AppendTo[Resolution, Eb1[[i]]]; ]] (*Keep that event in 'Resolution'*) >> > > > > > > >

**References**:**Re: Help with Speeding up a For loop***From:*dh <dh@metrohm.com>