我有一个Mathematica表达式(称为expr),它是许多项的总和。此外,我有一个列表(称为var),其中一些变量和函数可能出现在其中一些术语中。
我想做的第一件事是提取包含一定次数的变量和函数的术语。例如,如果是var = {a, f[_]},那么我可能想提取所有包含变量a的所有术语,其中包含变量a一次,函数f提取2次。f[f[a + b]]是满足这些条件的术语的一个例子。
我想做的第二件事是创建一个列表(称为输出),其中包含原始表达式的所有术语。该列表应该按照包含变量和变量中指定的函数的次数对术语进行分组。对于var = {a, f[_]},输出将是output = {{sum of those terms containing 0 * a and 0 * f[_], "sum of..." 1 * a and 0 f, "sum of..." 2a 0f, ... }, {"sum of..." 0a 1f, "sum of..." 1a, 1f, ... }}
给定问题2的解决方案,很容易解决问题1:要提取表达式的某个术语,只需从列表输出中选择正确的元素即可。出于这个原因,我试图解决问题2。为了保持清晰,我从一个简单的表达式开始,只包含一个术语。首先,我生成一个模式列表。
expr = f[a + f[y]]
var = {{a, 1}, {f[_], 3}}
basicpattern[symbol_, n_, term_] =
Hold[Table[Count[{term}, symbol, 10] == i, {i, 0, n}]]
basicpattern[#1, #2, expr] & @@@ var // ReleaseHold输出是
{{False, True}, {False, False, True, False}}其解释是:变量a出现一次,函数f出现2次。现在,我想利用基本模式中列表的外部乘积来组合模式。然后,新的模式列表可以与案例一起使用,以从expr中选择术语并将它们放入列表中。
在这里,我被困住了:如何将列表的外部乘积放在列表中?我猜
Outer[And, {{True, False}, {True, False, False, False}}, 1]但这并没有给出八个条款。
更新
在Sjoerd的帮助下,我走得更远了一点。
expr = f[a + f[y]];
var = {{a, 1}, {f[_], 3}};
basicpattern[symbol_, n_, term_] :=
Table[Hold[Count[{term}, symbol, 10]] == i, {i, 0, n}];
basicpattern[#1, #2, expr] & @@@ var;
Outer[And, ##] & @@ %;
test = %[[2, 3]]
%// ReleaseHold作为输出
Hold[Count[{f[a + f[y]]}, a, 10]] == 1 &&
Hold[Count[{f[a + f[y]]}, f[_], 10]] == 2
True其解释是f[a + fy]包含一次a和两次f_。外部产品是这样的测试列表。
假设我将费用改为
expr = f[a + fy] + gz +y^2-13x+ 12a +a fx
如何使用测试内容收集包含一次a和两次f_的所有术语
发布于 2011-12-09 21:26:08
你的问题说来话长,但我想你的问题归根结底是:
如何将列表的外部乘积取在列表中?
如果这是你唯一想知道的事的话。可以简单地这样做:
booleanLists = {{True, False}, {True, False, False, False}};
Outer[And, ##] & @@ booleanLists
(* ==> {{True, False, False, False}, {False, False, False, False}} *)https://stackoverflow.com/questions/8434033
复制相似问题