       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:= <<Statistics`ContinuousDistributions`
>
> gaussianArray[n_] :=
>         RandomArray[NormalDistribution[0.0, 1.0],{n,n}]  +
>          I  RandomArray[NormalDistribution[0.0, 1.0],{n,n}]
>
> In:= Timing[tmp=gaussianArray ;]
>
> Out= {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:

 Random[NormalDistribution[]] is already compiled.  normalpair
generates a _pair_ of random numbers.

We can easily modify normalpair to generate complex Gaussian numbers:

In:= gaussian = Compile[{{mu, _Real}, {sigma, _Real}},
mu + E^(2 Pi I Random[]) sigma Sqrt[-2 Log[Random[]]]]

In:= First[Timing[tmp = Table[gaussian[0, 1], {180}, {180}]; ]]
Out= 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
____________________________________________________________________

```

• Prev by Date: Re: FW: Re: Frequencies function
• Next by Date: Re: FW: Re: Frequencies function
• Previous by thread: Re: Compile and NormalDistribution
• Next by thread: Re: Re: Compile and NormalDistribution