Re: Re: choose elements from list based on elements in different list

• To: mathgroup at smc.vnet.net
• Subject: [mg86800] Re: [mg86734] Re: choose elements from list based on elements in different list
• From: DrMajorBob <drmajorbob at bigfoot.com>
• Date: Fri, 21 Mar 2008 01:54:43 -0500 (EST)
• References: <frqpnb\$4vl\$1@smc.vnet.net> <9299042.1206024293207.JavaMail.root@m08>

```Inner does SEEM a natural way to go, but see below, where my "bt" is a bit
faster than David's "dp".

n= 10^6;
Clear[ dp,bt,zeroQ]
SetAttributes[ zeroQ,Listable]
zeroQ[0]=True;
zeroQ[_]=False;
dp[ a_List,b_List]:= Inner[ If[ #1==0\[And] #2!=0,#2, Unevaluated@
Sequence[]]&,a,b,List]
bt[ a_List,b_List]:= Pick[ b, Transpose[ zeroQ/@ { a,b}], { True,False}]
one= RandomInteger[ GeometricDistribution[0.1],n];
two= RandomInteger[ GeometricDistribution[0.1],n];
test[ a_List,b_List]:= Module[ { t1,t2,r1,r2}, { t1,r1}= Timing@
dp[ a,b]; { t2,r2}= Timing@ bt[ a,b]; { t1,t2, r1==r2}]
test[ one,two]
{5.53549000000001, 1.3797390000000007, True}
test[two, one]
{5.561236000000008, 1.3858140000000105, True}

Oddly enough, BTW, replacing zeroQ by the built-in PossibleZeroQ slows "b"
by a factor of more than 30.

Still and all, Inner is the far simpler way to think of it, I suppose.

Bobby

On Thu, 20 Mar 2008 02:50:34 -0500, David Park <djmpark at comcast.net> wrote:

> Whenever one wants to do operations on two equal length structures the
> Inner
> statement is a good choice.
>
> Reihe1 = {22, 33, 44, 0, 0, 16, 5, 0, 0, 0};
> Reihe2 = {16, 27, 0, 0, 5, 11, 5, 0, 0, 12};
>
> Here we do the two tests and either insert the nonzero number in a new
> list,
> or insert an empty Sequence. The empty Sequence must be Unevaluated in
> the
> If statement or it would simply disappear for there.
>
> Inner[If[#1 == 0 \[And] #2 != 0, #2,
>    Unevaluated@Sequence[]] &, Reihe1, Reihe2, List]
> {5, 12}
>
> Inner[If[#2 == 0 \[And] #1 != 0, #1,
>    Unevaluated@Sequence[]] &, Reihe1, Reihe2, List]
> {44}
>
> This construction is also useful for the combination of equations.
>
> eqn1 = x == a + b;
> eqn2 = y == a - b;
>
> Inner[#1 + #2 &, eqn1, eqn2, Equal]
> x + y == 2 a
>
> Inner[Expand[2 #1 - #2] &, eqn1, eqn2, Equal]
> 2 x - y == a + 3 b
>

-- =

DrMajorBob at longhorns.com

```

• Prev by Date: Re: Unwanted lined in PDF-exported Graphics3D
• Next by Date: Re: texture mapping/memory leak?
• Previous by thread: Re: choose elements from list based on elements in different list
• Next by thread: Re: choose elements from list based on elements in different list