Re: Two speed challenges
- To: mathgroup at smc.vnet.net
- Subject: [mg47418] Re: Two speed challenges
- From: koopman at sfu.ca (Ray Koopman)
- Date: Sat, 10 Apr 2004 02:01:23 -0400 (EDT)
- References: <c4u1us$9a3$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
"Gareth J. Russell" <gjr2008 at columbia.edu> wrote in message
news:<c4u1us$9a3$1 at smc.vnet.net>...
>
> I would appreciate any advice on the following two pieces of code,
> which are the rate-limiting factors and are as fast as I can make them.
> Can anyone do better?
>
> Code 1
>
> This simply randomizes a vector (in case it matters,
> typical input is a 500-element vector of Reals).
>
> listRandomize = Compile[{{l, _Real, 1}},
> Sort[Table[{Random[], l[[i]]}, {i, 1, Length[l]}]][[All, 2]]]
It's usually faster to avoid named index variables. Try sorting
Map[{Random[],#}&,l] or Transpose[{Table[Random[],{Length[l]}],l}].
Also, don't bet the family farm on Random. I have found it can be quite
nonrandom, even in applications that use only the order properties of its
output. See my 16 Jun 2003 post "Warning -- another Random[] failure".
For confirmation that there is a problem and for a workaround, see Daniel
Lichtblau's 5 May 2000 post "Re: [mg23340] Random Geometric (long)".
>
>
> Code 2
>
> This computes the only part of Moran's I that must change when the
> ordering of elements in the vector z changes. It calculates the sum
> over all i and j of z_i*z_j*w_ij, where w is (obviously) a square matrix
>
> moranIPart1 = Compile[{{z, _Real, 1}, {w, _Real, 2}},
> Apply[Plus, Apply[Plus, Outer[Times, z, z]*w]]]
Use the built-in matrix-multiply operator. z.w.z should be much faster.