Re: position lists
- To: mathgroup at smc.vnet.net
- Subject: [mg68816] Re: position lists
- From: "dkr" <dkrjeg at adelphia.net>
- Date: Sat, 19 Aug 2006 00:41:42 -0400 (EDT)
- References: <ebujvu$6lu$1@smc.vnet.net><ec3r9m$2o5$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Peter,
You may be able to speed things up a bit by substituting
Range[Length@a] for Ordering[a] in Pos[4].
In[1]:=
a=Table[Random[Integer,{1,20}],{1000000}];
In[2]:=
Timing[Flatten /@ (Reap[(MapThread[Sow, {#1, a[[#1]]}] &
)[Ordering[a]],
Range[20]][[2]] /. {} -> {{0}});]
Out[2]=
{3.58 Second,Null}
In[3]:=
Timing[Flatten /@ (Reap[(MapThread[Sow, {#1, a[[#1]]}] &
)[Range[Length@a]],
Range[20]][[2]] /.{} -> {{0}});]
Out[3]=
{2.61 Second,Null}
dkr
Peter Pein wrote:
> I compared some different approaches to this task.
>
> the obvious one, which you do not like:
> Pos[1][a_, n_] := Flatten /@ (Position[a, #1] & ) /@ Range[n] /. {} -> {0};
>
> one with Case[]:
> Pos[2][a_, n_] := Module[{ao = Ordering[a], as},
> as = a[[ao]]; (Cases[Transpose[{as, ao}], {#1, x_} :> x] & ) /@
> Range[n] /. {} -> {0}];
>
> this one uses Pick[]
> Pos[3][a_, n_] := Module[{ao = Ordering[a], as},
> as = a[[ao]]; (Pick[ao, as, #1] & ) /@ Range[n]] /. {} -> {0};
>
> Sow/Reap:
> Pos[4][a_, n_] := Flatten /@
> (Reap[(MapThread[Sow, {#1, a[[#1]]}] & )[Ordering[a]],
> Range[n]][[2]] /.
> {} -> {{0}})
>
> and the Sow/Reap variant by "dkr":
> Pos[5][a_, n_] := Flatten[Reap[MapIndexed[Sow[#2[[1]], #1] & , a],
> Range[n]][[
> 2]] /. {} :> {{0}}, 1]
>
> The winner is the fourth version.
>
> See
> http://people.freenet.de/Peter_Berlin/Mathe/Igor_Pos.nb
>
> or if you're sitting in front of a box without Mathematica/MathReader:
>
> http://people.freenet.de/Peter_Berlin/Mathe/Igor_Pos.pdf
>
>
> Peter