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. > > Many thanks in advance. > 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 > > >