Re: Compile and NormalDistribution
- To: mathgroup at smc.vnet.net
- Subject: [mg15220] Re: Compile and NormalDistribution
- From: Paul Abbott <paul at physics.uwa.edu.au>
- Date: Tue, 22 Dec 1998 04:01:49 -0500
- Organization: University of Western Australia
- References: <75f9jo$7mi@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
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
____________________________________________________________________
- Follow-Ups:
- Re: Re: Compile and NormalDistribution
- From: jtischer@col2.telecom.com.co (Cl-Jurgen Tischer)
- Re: Re: Compile and NormalDistribution