Wolfram mathematica 从大型表达式中提取与模式匹配的表达式
我有一个Mathematica表达式,它包含一个平方根Wolfram mathematica 从大型表达式中提取与模式匹配的表达式,wolfram-mathematica,Wolfram Mathematica,我有一个Mathematica表达式,它包含一个平方根 expr = a / (b + Sqrt[c]); 其中a,b,c是大表达式。我想提取sqrt下的表达式,例如通过匹配模式,类似 Match[expr,Sqrt[x_]] // should return c 有没有一种简单的方法可以做到这一点?我在等待一些示例,但在此期间,请尝试: Cases[expr, x_^(1/2 | -1/2) :> x, Infinity] Sqrt(x)的标准内部形式是Power[x,1/2]理论
expr = a / (b + Sqrt[c]);
其中a
,b
,c
是大表达式。我想提取sqrt下的表达式,例如通过匹配模式,类似
Match[expr,Sqrt[x_]] // should return c
有没有一种简单的方法可以做到这一点?我在等待一些示例,但在此期间,请尝试:
Cases[expr, x_^(1/2 | -1/2) :> x, Infinity]
Sqrt(x)的标准内部形式是
Power[x,1/2]
理论上,这应该正常工作:
extractSqrt = Cases[ToBoxes@#, SqrtBox@x_ :> ToExpression@x, Infinity] &;
extractSqrt[expr]
如果您愿意将分配更改为
expr
,可以执行以下操作:
expr = Hold[a / (b + Sqrt[c])];
Cases[expr, HoldPattern @ Sqrt[x_] :> x, Infinity]
赋值语句中的Hold
阻止Mathematica对表达式应用任何简化。在这种情况下,Sqrt[c]
被“简化”为Power[c,Rational[1,2]]
HoldPattern
在Cases
表达式中非常重要,可以防止匹配的模式发生同样的简化。@Sjoerd I imagine in在各种情况下都会失败:-/@Sjoerd我做了一个改变来抓更多的案子。@Sjoerd,请看我的其他答案。我没有时间测试它,但我认为它是解决方案。如果出现明显的故障,请留下评论。@Mr.Wizard好吧,当然还有a=0…%^的小例子)也不需要考虑a/(b+Hold[Sqrt[c]]),是吗?(只是开玩笑)。除此之外,它看起来像是你敲打的。@yoda在原始模式中没有负指数,并且a/(0+Sqrt[c])被编码为乘以[a,幂[c,有理[-1,2]]。您的第二个示例失败,因为无穷大表示从1到无穷大的级别,而c表示级别0。改用{0,无穷大}。在b+c中,b和c处于1级,因为它们处于加号[b,c]。因此,它在这种情况下起作用。