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:
>
> 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
>
>
>
>
>
>> 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,
>>
>
>
>>
>
>
>
>
>> 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'*)
>>
>
>
>
>
>
>
>

```

• Prev by Date: Re: pure function with an NIntegrate command
• Next by Date: Re: Re: Help with a possible bug
• Previous by thread: Re: Help with Speeding up a For loop
• Next by thread: Re: Re: Help with Speeding up a For loop