将表达式拆分为术语集合

时间:2011-10-08 14:56:48

标签: wolfram-mathematica

我有一个很长的表达,我想分成一组术语。比如说我有:

a + b - c + d + 4*e - 3*f

我想通过加法/减法将表达式拆分为:

{a, b, -c, d, 4*e, -3*f}

我的动机是我希望按期限处理原始表达术语。这可能吗?

编辑:与我在Mathematica中实际处理的内容相比,给出的示例非常简单,只是因为我不确定如何在这里编写Math。

4 个答案:

答案 0 :(得分:11)

要拆分表达式,您需要使用LevelLevel为您提供了子表达式列表,您可以指定要返回子表达式的级别。在这种情况下,您需要levelspec 1。

In[1]:= expr = a + b - c + d + 4 e - 3 f;
In[2]:= Level[expr, 1]

Out[2]= {a, b, -c, d, 4 e, -3 f}

表达稍微复杂的示例:

In[3]:= expr2 = a^2 + 5 bc/ef - Sqrt[g - h] - Cos[i]/Sin[j + k];
In[4]:= Level[expr2, 1]

Out[4]= {a^2, (5 bc)/ef, -Sqrt[g - h], -Cos[i] Csc[j + k]}

答案 1 :(得分:4)

如果表达式是多项式,您也可以使用MonomialList

In[56]:= MonomialList[a + b - c + d + 4*e - 3*f]

Out[56]= {a, b, -c, d, 4 e, -3 f}

(不适用于非多项式,例如尤达的expr2。)

答案 2 :(得分:4)

由于没有其他人提及它,相当于Yoda的Level[expr, 1]构造是使用ApplyList替换表达式的头部:

In[1]:= expr = a + b - c + d + 4 e - 3 f;

In[2]:= List @@ expr
        Level[expr, 1] == %

Out[2]= {a, b, -c, d, 4 e, -3 f}
Out[3]= True


In[4]:= expr2 = a^2 + 5 bc/ef - Sqrt[g - h] - Cos[i]/Sin[j + k];

In[5]:= List @@ expr2
        Level[expr2, 1] == %

Out[5]= {a^2, (5 bc)/ef, -Sqrt[g - h], -Cos[i] Csc[j + k]}
Out[6]= True

这两种方法做的基本相同,时间相同(使用我的版本average timing function

In[1]:= SetOptions[TimeAv, Method -> {"MinNum", 80000}, "BlockSize" -> 20000];

In[7]:= List @@ expr // TimeAv

Total wall time is 0.244517, total cpu time is 0.13 
and total time spent evaluating the expression is 0.13

The expression was evaluated 80000 times, in blocks of 20000 runs. This yields
a mean timing of 1.625*10^-6 with a blocked standard deviation of 2.16506*10^-7.

Out[7]= {1.625*10^-6, {a, b, -c, d, 4 e, -3 f}}

In[8]:= Level[expr, 1] // TimeAv

Total wall time is 0.336927, total cpu time is 0.16 
and total time spent evaluating the expression is 0.16

The expression was evaluated 80000 times, in blocks of 20000 runs. This yields 
a mean timing of 2.*10^-6 with a blocked standard deviation of 3.53553*10^-7.

Out[8]= {2.*10^-6, {a, b, -c, d, 4 e, -3 f}}

答案 3 :(得分:4)

您也可以使用Replace

In[65]:= Replace[a + b - c + d + 4*e - 3*f, HoldPattern[Plus[a___]] :> {a}]

Out[65]= {a, b, -c, d, 4 e, -3 f}

你需要使用HoldPattern(或一些等效技巧)来阻止Plus[a__]评估到a__,其结果是将第一个参数包装在列表中而不是创建Plus的参数列表。