Mathematica 9 is now available
Services & Resources / Wolfram Forums / MathGroup Archive
-----

MathGroup Archive 2008

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

Search the Archive

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>
  • Reply-to: drmajorbob at longhorns.com

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