Re: "misbehaving" Union function

• To: mathgroup at smc.vnet.net
• Subject: [mg24162] Re: [mg24075] "misbehaving" Union function
• From: Andrzej Kozlowski <andrzej at tuins.ac.jp>
• Date: Wed, 28 Jun 2000 22:50:44 -0400 (EDT)
• Sender: owner-wri-mathgroup at wolfram.com

```The explanation is as follows. Union admits one option: SameTest. This comes
with the default setting of Automatic. With this default setting the
elements of the list to which Union is being applied are first sorted in
canonical order and then only the adjacent elements are compared. This has
the advantage of speed. However, when working with approximate numbers, two
numbers (or list of numbers in your case) which are close enough to be
considered equal may not end up as being adjacent after sorting. When that
happens both may be kept. So the solution is to use an explicit setting for
SameTest: SameTest->Equal. If you use Union[...,SameTest->Equal] instead of
Union[...] in your example you will get the output:

Out[26]=
{{0, 0.}, {6, 2.}, {14, 6.}, {15, 7.}, {25, 11.}, {26, 12.}}

Andrzej Kozlowski

--
Andrzej Kozlowski
Toyama International University, JAPAN

For Mathematica related links and resources try:
<http://www.sstreams.com/Mathematica/>

on 6/23/00 3:26 PM, Felix Farkas at farkas at ica.epfl.ch wrote:

> Hi,
> i am trying to build up a list of points. The input is,
> a list of events. I use the Union function in order to
> avoid duplicate points. however i do not have the expected result.
> i really don't know where the error is coming from.
> Could somebody, please, tell me where is the fault?
> I would greatly appreciate any suggestions.
>
> Regards,
> Felix
>
> Here is the function:
>
> In[1]:= Genpoints[events_] :=
> Module[
> {ev = events, rate,
> duration, time, burst, bytes = 0, points = {}},
> rate := ee[[3]];
> duration := ee[[2]];
> time := ee[[1]];
> burst := ee[[4]];
> While[Length[ev] != 0,
> ee = First[ev];
> ev = Rest[ev];
> points = Union[points,
> If[rate == -1,
> (*then*)
> bytes += burst; {{time,
> bytes - burst}, {time, bytes}},
> (*else*)
> bytes += rate*duration;
> Print[{{time, bytes - rate*duration}, {time + duration,
> bytes}}];
> {{time, bytes -
> rate*duration}, {time + duration, bytes}}]
> ]
> ];
> points
> ]
>
> The output generated is:
>
> In[2]:= aa = {{0, 6, 0.3333333, 2, 2, 1},
> {6, 8, 0.5, 4, 2, 1}, {14, 1, 1, 1, 2, 1},
> {15, 10, 0.4, 4, 2, 1}, {25, 1, 1, 1, 2, 1}};
> In[3]:=  po2 = Genpoints[aa]
> Out[3]= {{0, 0.}, {6, 2.}, {6, 2.}, {14, 6.},
> {15, 7.}, {25, 11.}, {26, 12.}}
>
>
>
> -----------------------------------------------------------------------------
> Felix Farkas
> EPFL-DSC-ICA
> IN-Ecublens
> CH-1015 Lausanne
> Switzerland
>
> tel:       0041 21 693 6601
> fax:       0041 21 693 6610
> email:     felix.farkas at epfl.ch
>
>
>

```

• Prev by Date: RE: Need to reduce 2 lists so that only {x,y} pairs with same x remain
• Next by Date: Re: Re: options to functions
• Previous by thread: RE: Re: "misbehaving" Union function