Re: Re: Compile and NormalDistribution
- To: mathgroup at smc.vnet.net
- Subject: [mg15226] Re: [mg15220] Re: Compile and NormalDistribution
- From: jtischer at col2.telecom.com.co (Cl-Jurgen Tischer)
- Date: Wed, 23 Dec 1998 01:04:03 -0500
- Organization: Universidad del Valle
- References: <75f9jo$7mi@smc.vnet.net> <199812220901.EAA29138@smc.vnet.net.>
- Sender: owner-wri-mathgroup at wolfram.com
Paul,
as to speed,
In[1]:= Timing[tmp=gaussianArray[128] ;] Out[1]= {1.43 Second,Null}
In[2]:= First[Timing[tmp = Table[gaussian[0, 1], {180}, {180}]; ]]
Out[2]= 1.92 Second
with a 300Mhz PII, 128M Ram, clone. But since it's for the fun of it, I
offer a (moderate) speedup:
In[3]:= fu=Compile[{{mu, _Real}, {sigma,
_Real},{n,_Integer},{m,_Integer}},
Table[mu + E^(2\[Pi] Random[] I) sigma Sqrt[-2
Log[Random[]]],{n},{m}]]
In[4]:= First[Timing[tmp=fu[0,1,180,180];]]
Out[4]= 0.66 Second
Jurgen
Paul Abbott wrote:
>
> Andrew Watson wrote:
>
> > In[1]:= <<Statistics`ContinuousDistributions`
> >
> > gaussianArray[n_] :=
> > RandomArray[NormalDistribution[0.0, 1.0],{n,n}] +
> > I RandomArray[NormalDistribution[0.0, 1.0],{n,n}]
> >
> > In[6]:= Timing[tmp=gaussianArray[128] ;]
> >
> > Out[6]= {1.26667 Second,Null}
>
> You must have a very fast computer. This is much slower on my PowerMac!
>
> > At 11:11 PM -0800 12/17/98, Brett Patterson wrote:
> > >
> > >I am trying to speed up the generation of a large array of random
> > >complex Gaussian numbers (e.g. 360 x 360).
>
> Some comments. If you look at Statistics`NormalDistribution` you can see
> how Random[] and RandomArray[] works for NormalDistribution[]:
>
> normal = Compile[{{mu, _Real}, {sigma, _Real},
> {q1, _Real}, {q2, _Real}},
> mu + sigma Sqrt[-2 Log[q1]] Cos[2Pi q2] ]
>
> NormalDistribution/: Random[NormalDistribution[mu_:0, sigma_:1]] :=
> normal[mu, sigma, Random[], Random[]]
>
> normalpair = Compile[{{mu, _Real}, {sigma, _Real},
> {q1, _Real}, {q2, _Real}},
> mu + sigma Sqrt[-2 Log[q1]] {Cos[2Pi q2], Sin[2Pi q2]}]
>
> NormalDistribution/: RandomArray[
> NormalDistribution[mu_:0, sigma_:1], dim_] :=
> Module[{n, array},
> n = If[VectorQ[dim], Apply[Times, dim], dim];
> array = Flatten[Table[normalpair[mu, sigma, Random[], Random[]],
> {Quotient[n, 2]}]];
> If[OddQ[n],
> AppendTo[array, normal[mu, sigma, Random[], Random[]] ] ];
> If[VectorQ[dim] && Length[dim] > 1,
> Fold[Partition[#1, #2]&, array, Reverse[Drop[dim, 1]] ],
> array ]
> ] /;
> (IntegerQ[dim] && dim > 0) || VectorQ[dim, (IntegerQ[#] && # > 0)&]
>
> The key points are that:
>
> [1] Random[NormalDistribution[]] is already compiled. [2] normalpair
> generates a _pair_ of random numbers.
>
> We can easily modify normalpair to generate complex Gaussian numbers:
>
> In[1]:= gaussian = Compile[{{mu, _Real}, {sigma, _Real}},
> mu + E^(2 Pi I Random[]) sigma Sqrt[-2 Log[Random[]]]]
>
> In[2]:= First[Timing[tmp = Table[gaussian[0, 1], {180}, {180}]; ]]
> Out[2]= 6.4 Second
>
> Cheers,
> Paul
>
> ____________________________________________________________________
> Paul Abbott Phone: +61-8-9380-2734
> Department of Physics Fax: +61-8-9380-1014
> The University of Western Australia Nedlands WA 6907
> mailto:paul at physics.uwa.edu.au AUSTRALIA
> http://www.physics.uwa.edu.au/~paul
>
> God IS a weakly left-handed dice player
> ____________________________________________________________________
- References:
- Re: Compile and NormalDistribution
- From: Paul Abbott <paul@physics.uwa.edu.au>
- Re: Compile and NormalDistribution