Services & Resources / Wolfram Forums / MathGroup Archive
-----

MathGroup Archive 2008

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Tagged list processing

  • To: mathgroup at smc.vnet.net
  • Subject: [mg86915] Re: Tagged list processing
  • From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
  • Date: Wed, 26 Mar 2008 04:52:45 -0500 (EST)
  • Organization: The Open University, Milton Keynes, UK
  • References: <fsa5fq$adp$1@smc.vnet.net>

carlos at colorado.edu wrote:
> This is related to a recent question. Best stated through an example.
> I have two flat lists of equal length:
> 
> tag={0,0,1,0,0,  -3,0,0,0,0,          2,4,1,0,0};
> val={0,0,4,5,6,  P,1/2,0,-3.0,a+4, 8,16.4,0,Sin[ang],Cos[ang]};
> 
> tag contains only integers whereas val can have numbers or
> expressions that will (eventually) evaluate to a number.
> 
> Task. Generate a pointer list to all nz values in tag, and a
> corresponding list of values:
> 
> nztag={3,6,11,12,13};   (* may be empty *)
> nzval={4,P,8,16.4,0};   (* may be empty *)
> 
> and also build the complementary lists
> 
> ztag={1,2,4,5,7,8,9,10,14,15};
> zval={0,0,5,6,1/2,0,-3.0,a+4, Sin[ang],Cos[ang]};
> 
> Obviously ztag=Position[tag,0]; but which
> form argument do I use for nztag in Position[tag,form]?
> Can I build zval  and nzval with Table for speed ?
> (lists may contain 10^4 to 10^6  items)
> 
> Constraint: must work in 4.0 thru 6.0 since some of my
> remote students have legacy academic versions. Thanks.

The following approach should work with version 4.0 and above (I have 
discarded a fastest solution that used Pick). On my system, it yields 
the four lists in less than 0.2 seconds, starting with two lists of 
150,000 elements each.

In[1]:= tag = {0, 0, 1, 0, 0, -3, 0, 0, 0, 0, 2, 4, 1, 0, 0};
val = {0, 0, 4, 5, 6, P, 1/2, 0, -3.0, a + 4, 8, 16.4, 0, Sin[ang],
    Cos[ang]};

In[3]:= ztag = Flatten@Position[tag, 0]

Out[3]= {1, 2, 4, 5, 7, 8, 9, 10, 14, 15}

In[4]:= nztag = Complement[Range[Length@tag], ztag]

Out[4]= {3, 6, 11, 12, 13}

In[5]:= (* Alternatively, though slower than above *)
nztag =
  Flatten@Position[tag, x_ /; x != 0]

Out[5]= {3, 6, 11, 12, 13}

In[6]:= nzval = val[[nztag]]

Out[6]= {4, P, 8, 16.4, 0}

In[7]:= zval = val[[ztag]]

Out[7]= {0, 0, 5, 6, 1/2, 0, -3., 4 + a, Sin[ang], Cos[ang]}

In[8]:= tag = Flatten@Table[tag, {10^4}];
val = Flatten@Table[val, {10^4}];

In[10]:= First@Timing[ztag = Flatten@Position[tag, 0]]

Out[10]= 0.149143

In[11]:= First@Timing[nztag = Complement[Range[Length@tag], ztag]]

Out[11]= 0.043276

In[12]:= First@Timing[nzval = val[[nztag]]]

Out[12]= 0.004319

In[13]:= First@Timing[zval = val[[ztag]]]

Out[13]= 0.011485

In[14]:= %%%% + %%% + %% + %

Out[14]= 0.208223

In[15]:= Length@tag

Out[15]= 150000


Best regards,
-- 
Jean-Marc


  • Prev by Date: Re: Intersection of 2D Surfaces in 3D
  • Next by Date: Re: Intersection of 2D Surfaces in 3D
  • Previous by thread: Re: Tagged list processing
  • Next by thread: Intersection of 2D Surfaces in 3D