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.