Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wolfram mathematica 组合模式以收集术语_Wolfram Mathematica_Design Patterns - Fatal编程技术网

Wolfram mathematica 组合模式以收集术语

Wolfram mathematica 组合模式以收集术语,wolfram-mathematica,design-patterns,Wolfram Mathematica,Design Patterns,我有一个Mathematica表达式(称为expr),它是许多项的总和。我还有一个列表(称为var),其中包含一些变量和函数,这些变量和函数可能会出现在这些术语中 我想做的第一件事是提取包含一定次数的变量和函数的术语。例如,如果var={a,f[\u]},那么我可能希望提取包含变量a的所有术语一次,提取函数f两次f[f[a+b]]是满足这些标准的术语示例 我想做的第二件事是创建一个列表(称为output),其中一次包含原始表达式的所有术语。该列表应该是这样的:它根据术语包含var中指定的变量和函

我有一个Mathematica表达式(称为expr),它是许多项的总和。我还有一个列表(称为var),其中包含一些变量和函数,这些变量和函数可能会出现在这些术语中

我想做的第一件事是提取包含一定次数的变量和函数的术语。例如,如果
var={a,f[\u]}
,那么我可能希望提取包含变量
a
的所有术语一次,提取函数
f
两次
f[f[a+b]]
是满足这些标准的术语示例

我想做的第二件事是创建一个列表(称为output),其中一次包含原始表达式的所有术语。该列表应该是这样的:它根据术语包含var中指定的变量和函数的次数对术语进行分组。 对于
var={a,f[\]}
output将是
output={{包含0*a和0*f[\]]、“1*a和0f之和”、“2*a和0f之和”、{“0*a和1f之和”、{“1*a和1f之和”、{code>

给出问题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出现两次。 现在我想使用basicpattern中列表的外积来组合模式。然后,新的模式列表可以与案例一起使用,从expr中选择术语并将它们放入列表中

在这里我被卡住了:如何将列表的外积放入列表中?我猜

Outer[And, {{True, False}, {True, False, False, False}}, 1]
但这并没有给出八个条件

更新

在舍尔德的帮助下,我走得更远了

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+f[y]]包含一次a和两次f[\uz]。 外部产品是这样的测试列表

假设我把expr改为

expr=f[a+f[y]]+g[z]+y^2-13x+12a+af[x]


我如何使用测试内容来收集包含一个a和两个f[3;]的所有术语?

你的问题说来话长,但我想你的问题归结为:

如何将列表的外积放入列表中

如果这是你唯一想知道的事情,那么你已经很接近了。可以这样简单地完成:

booleanLists = {{True, False}, {True, False, False, False}};

Outer[And, ##] & @@ booleanLists

(* ==>  {{True, False, False, False}, {False, False, False, False}} *)

你的问题说来话长,但我想你的问题可以归结为:

如何将列表的外积放入列表中

如果这是你唯一想知道的事情,那么你已经很接近了。可以这样简单地完成:

booleanLists = {{True, False}, {True, False, False, False}};

Outer[And, ##] & @@ booleanLists

(* ==>  {{True, False, False, False}, {False, False, False, False}} *)

您写道:“这里出错了。Mathematica产生了一个错误。”-添加哪个错误,或者添加(准确地)复制到错误的代码。最好两者都有。:-)老实说,我不太清楚你想要实现什么,但从
var
rule
的格式来看,我认为
所有规则中的第二个
应该是
@@@@code>@nilo de roock和Heike。谢谢你的评论。实际上,错误源于使用/@而不是@@。我正在重写我的问题,我认为有必要完全重写它。规则是什么?我必须包括我以前的帖子吗?我能把它换掉吗?或者我需要删除这个主题并开始一个新的主题吗?你可以编辑这个问题,尽管我不知道这样的问题是否有“规则”。因为没有人发布你原始问题的答案,如果你愿意,完全重写似乎没有问题。你写道:“这里出了问题。Mathematica产生了一个错误。”-添加错误,或添加(准确地)复制到错误的代码。最好两者都有。:-)老实说,我不太清楚你想要实现什么,但从
var
rule
的格式来看,我认为
所有规则中的第二个
应该是
@@@@code>@nilo de roock和Heike。谢谢你的评论。实际上,错误源于使用/@而不是@@。我正在重写我的问题,我认为有必要完全重写它。规则是什么?我必须包括我以前的帖子吗?我能把它换掉吗?或者我需要删除此主题并开始新的主题吗?您可以编辑此问题,尽管我不知道是否有针对此类问题的“规则”。由于没有人发布您原始问题的答案,如果您愿意,完全重写似乎没有问题。谢谢。有了这个,我离解决方案又近了一步。我想我没有把问题说清楚。我将尝试更新我的问题。谢谢。有了这个,我离解决方案又近了一步。我想我没有把问题说清楚。我将尝试更新我的问题。