RE: Re: Fast (compiled) routine for element testing and replacement in large matrices?

*To*: mathgroup at smc.vnet.net*Subject*: [mg24027] RE: [mg23978] Re: Fast (compiled) routine for element testing and replacement in large matrices?*From*: "David Park" <djmp at earthlink.net>*Date*: Tue, 20 Jun 2000 03:07:40 -0400 (EDT)*Sender*: owner-wri-mathgroup at wolfram.com

> > Hi Gareth --- > > This way should be much faster: > > d2wreal[w_, l_, u_] := Map[If[(# > l) && (# <= u), 1, 0] &, w, {2}] > > With Mathematica 4 on my 450Mhz PIII your example with a matrix size of > 1000x1000 takes 1.9s. > > Regards, > > Bob Abraham > > > "Gareth J. Russell" <russell at cerc.columbia.edu> wrote in message > news:8iccl1$9oj at smc.vnet.net... > > Hello, > > > > My first post. I am moving from another software package to Mathematica, > and > > I often work with very large matrices in the context of simulations, so > > speed is important. Here is a problem for which I would like a serious > speed > > increase. > > > > Given a matrix of real numbers, I want to generate a new matrix where > > values from a certain range are replaced with 1, and the remainder with > > zero. Matrix size is often on the order of 1000 by 1000 (they are always > > square). > > > > I defined a function that does the comparison using If[], > > and made it listable: > > > > d2wreal[w_,l_,u_] := If[(w>l)&&(D<=u),1,0] > > SetAttributes[d2wreal,Listable] > > > > These are typical times: > > > > a = Table[Random[], {i, 1, 100}, {j, 1, 100}]; > > t = Timing[b = d2wreal[a, 0.2, 0.4]][[1]] > > 0.46666666666666856 Second > > > > a = Table[Random[], {i, 1, 1000}, {j, 1, 1000}]; > > t = Timing[b = d2wreal[a, 0.2, 0.4]][[1]] > > 65.55 Second > > > > I tried to generate some compiled alternatives myself, but I > couldn't find > > one that was faster. I reckon a 10x speed-up should be > possible, possibly > > more. My other software takes only 0.75 seconds for the 1000 by 1000 > matrix > > function. > > > > Can anyone suggest a way to speed this up? > > > > Thanks, > > > > Gareth > > > > > > ================================================== > > Dr. Gareth J. Russell > > > > NEW ADDRESS and E-MAIL FROM 1ST SEPTEMBER, 1999 > > > > Center for Environmental Research and Conservation > > MC 5556 > > Columbia University > > 1200 Amsterdam Avenue > > New York, NY 10027, U.S.A. > > > > Phone: ++1 212 854 5094 > > Fax: ++1 212 854 8188 > > E-mail: russell at cerc.columbia.edu > > WWW: http://web.utk.edu/~grussell (NO CHANGE) Hi Bob, Gareth, and MathGroup, This interests me. I want to know why mapping a pure function onto an array is so much faster than mapping the name of a user defined function. op1[l_, u_][x_] := If[l <= x <= u, 1, 0] op2[l_, u_] := If[l <= # <= u, 1, 0] & a = Table[Random[], {i, 1, 1000}, {j, 1, 1000}]; Map[op1[0.2, 0.4], a, {2}]; // Timing {16.25 Second, Null} Map[op2[0.2, 0.4], a, {2}]; // Timing {0.77 Second, Null} The Mathematica Book doesn't seem to explain this. David Park djmp at earthlink.net http://home.earthlink.net/~djmp/