vector union
- To: mathgroup at smc.vnet.net
- Subject: [mg23078] vector union
- From: Russell Towle <rustybel at foothill.net>
- Date: Sat, 15 Apr 2000 03:00:35 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
Hi all,
David Park responded to my programming challenge--find the union of a list
of n-vectors with real-valued machine components--and contrived an
excellent solution. He appealed to a function written by Carl Woll. David's
methods are about 15 times faster!
Now my good old 'vector union' function looks like this:
vunion::usage = "vunion[v] returns the union of a list of n-vectors.";
vunion[v_] :=
Union[Chop[v, .000001],
SameTest -> ((Sign[#1] == Sign[#2]) &&
(Chop[#1 - #2, .000001] == Table[0, {Length[v[[1]] ]}] ) &)]
And David's looks like this:
(*Carl Woll's function, slightly modified*)
OrderedUnion[li_] :=
Block[{i},
i[n_] := (i[n] = Null; n);
i /@ li]
vunion2[v_]:=
Block[{accuracylist,v2},
accuracylist = OrderedUnion[SetAccuracy[v2=Sort[Chop[v,.000001]], 6]];
Do[If[accuracylist[[i]] === Null, v2[[i]] = Null], {i, Length[v2]}];
DeleteCases[v2, Null]
]
A comparison, using 1280 3-vectors:
Length[testlist]
Length[testlist[[1]]]
Length[v1=vunion[testlist]]//Timing
Length[v2=vunion2[testlist]]//Timing
v1==v2
1280
3
{5.71667 Second, 322}
{0.366667 Second, 322}
True
Russell Towle
Box 141
Dutch Flat, CA 95714
(530) 389-2872