Re: Extract[expr, Position[expr, patt], h]
- To: mathgroup at smc.vnet.net
- Subject: [mg114269] Re: Extract[expr, Position[expr, patt], h]
- From: Alexei Boulbitch <alexei.boulbitch at iee.lu>
- Date: Mon, 29 Nov 2010 06:08:56 -0500 (EST)
Hi, Peter, could you please explain the use of the construct "underscore, point", like a_. that you use here: Extract[ex, Position[ex, (a_.)*x^(nx_.)*y^(ny_.)*z^(nz_.) /; nx == ny - 1 == nz - 3]] Thank you, Alexei Hi! Try Cases: In[1]:= ex = Expand[(x + y + z)^13]; In[2]:= Extract[ex, Position[ex, (a_.)*x^(nx_.)*y^(ny_.)*z^(nz_.) /; nx == ny - 1 == nz - 3]] Out[2]= {60060*x^3*y^4*z^6} In[3]:= Cases[ex, (a_.)*x^(nx_.)*y^(ny_.)*z^(nz_.) /; nx == ny - 1 == nz - 3] Out[3]= {60060*x^3*y^4*z^6} In[4]:= Extract[ex, Position[ex, (a_.)*x^(nx_.)*y^(ny_.)*z^(nz_.) /; nx == ny - 1 == nz - 3], h] Out[4]= {h[60060*x^3*y^4*z^6]} In[5]:= Cases[ex, pat:(a_.)*x^(nx_.)*y^(ny_.)*z^(nz_.) /; nx == ny - 1 == nz - 3 :> h[pat]] Out[5]= {h[60060*x^3*y^4*z^6]} In[6]:= Do[foo[i] = i, {i, -3, 3}] In[7]:= Information["foo", LongForm -> False] Global`foo foo[-3] = -3 foo[-2] = -2 foo[-1] = -1 foo[0] = 0 foo[1] = 1 foo[2] = 2 foo[3] = 3 In[13]:= Cases[DownValues[foo], f:foo[_?Positive] :> (f =. ), Infinity] Out[13]= {Null, Null, Null} In[14]:= Information["foo", LongForm -> False] Global`foo foo[-3] = -3 foo[-2] = -2 foo[-1] = -1 foo[0] = 0 Am Mon, 22 Nov 2010 12:35:34 +0000 (UTC) schrieb kj<no.email at please.post>: > > > I am surprised that Mathematica does not have the equivalent of > these functions already: > > extractMatching[expr_, patt_] := Extract[expr, Position[expr, patt]] > extractMatching[expr_, patt_, h_] := Extract[expr, Position[expr, > patt], h] > > The first one extracts all the subexpressions in expr that match > the pattern patt (including possibly expr itself). The second > wraps the extracted patterns with the head h before evaluation. > > I find myself needing one or the other of these functions all the > time. Is there a way to make them automatically available to all > my Mathematica sessions? > > But maybe they already exist in Mathematica, and I just missed > them. If so, please let me know. > > Alternatively, maybe my reliance on extractMatching is diagnostic > of my having some thought habits that are counterproductive when > doing rules-based programming (analogous to the habit developed > through the practice of procedural programming of using for-loops > and while-loops)... > > Just to be concrete, here's the latest task for which I needed this > functionality: Unset all the defined expressions foo[i] where i is > some positive integer. The solution I found (after many, many > failed attempts!) turned out to be > > extractMatching[DownValues[foo], HoldPattern[foo[x_ /; x> 0]], Unset] > > (The HoldPattern was necessitated by the fact that some of the > DownValues of foo recursively refer to foo; without the HoldPattern > one gets an infinite recursion.) > > Is there a simpler solution to this problem in terms Mathematica > built-in functions? > > TIA! > > ~kj > -- Alexei Boulbitch, Dr. habil. Senior Scientist Material Development IEE S.A. ZAE Weiergewan 11, rue Edmond Reuter L-5326 CONTERN Luxembourg Tel: +352 2454 2566 Fax: +352 2454 3566 Mobile: +49 (0) 151 52 40 66 44 e-mail: alexei.boulbitch at iee.lu www.iee.lu -- This e-mail may contain trade secrets or privileged, undisclosed or otherwise confidential information. If you are not the intended recipient and have received this e-mail in error, you are hereby notified that any review, copying or distribution of it is strictly prohibited. Please inform us immediately and destroy the original transmittal from your system. Thank you for your co-operation.