Re: For Routine to Map Routine
- To: mathgroup at smc.vnet.net
- Subject: [mg70441] Re: For Routine to Map Routine
- From: Benedetto Bongiorno <bbongiorno at attglobal.net>
- Date: Mon, 16 Oct 2006 02:35:44 -0400 (EDT)
- References: <egse9i$css$1@smc.vnet.net> <4532622A.8010704@gmail.com>
Jean-Marc Thank you for your prompt response. You solution works beautifully. Regards, Ben Jean-Marc Gulliet wrote: > Benedetto Bongiorno wrote: >> To All, >> >> Dimensions of ans01 is 2185850 by 5. >> I am looking to convert my For routine to the more efficient Map routine >> >> n=Length[ans01] >> fo={}; >> >> For[i=1, i<n, i++, >> If[ans01[[i,1]] == ans01[[i+1,1]], >> AppendTo[fo, ans01[[1]]]]; >> >> I tried >> Map[If[#[[1]] == #[[1]],#]&,ans01]; >> >> But it does not work. >> >> Thank you >> >> Ben >> >> > Hi Ben, > > The following function is linear in time and is roughly 40 times > faster than your procedure when processing a list of 100,000 elements. > 2185850 elements of 5 integers are processed in less than 40 seconds > on my system. > > In[1]:= > myConvert[data_?MatrixQ]:= > Module[{sp}, > sp=Split[data, #1[[1]]\[Equal]#2[[1]]&]; > Flatten[Most/@Extract[sp, Position[Length/@sp, x_/;x>1]],1] > ] > > In[2]:= > ans01=Table[Random[Integer,{0,5}],{2185850},{5}]; > > In[3]:= > Timing[myConvert[ans01];][[1]] > > Out[3]= > 37.032 Second > > In[4]:= > ans01=Table[Random[Integer,{0,5}],{100000},{5}]; > > In[5]:= > t1=Timing[n=Length[ans01]; > fo={}; > For[i=1,i<n,i++,If[ans01[[i,1]]\[Equal] > ans01[[i+1,1]],AppendTo[fo,ans01[[i]]]];]][[1]] > > Out[5]= > 65.922 Second > > In[6]:= > t2=Timing[fo2=myConvert[ans01];][[1]] > > Out[6]= > 1.703 Second > > In[7]:= > fo\[Equal]fo2 > > Out[7]= > True > > In[8]:= > t1/t2 > > Out[8]= > 38.7093 > > Regards, > Jean-Marc > >