Daniel Lichtblau wrote:
> 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.
> [...]
This will work in version 4, and is significantly faster than what I
posted before.
tagsAndValues2[tag_List,val_List] := Module[
{ztag,nztag},
{nztag,ztag} =
Transpose[Table[If[tag[[j]]==0, {Sequence[],j}, {j,Sequence[]}],
{j,Length[tag]}]]
{nztag,val[[nztag]],ztag,val[[ztag]]}
]
Daniel Lichtblau
Wolfram Research