控制表达式中变量的顺序

时间:2010-10-16 00:27:08

标签: wolfram-mathematica

在Mathematica中,您如何改变变量的重要性顺序?例如:如果我输入b + c + a + d,我得到一个+ b + c + d但我希望b和d先于其他变量。所以我得到b + d + a + c

请注意,我想在+非交换的地方使用它

3 个答案:

答案 0 :(得分:5)

首先,您需要定义一个排序函数,如:

In[1]:= CPOrdering[a]=3;
CPOrdering[b]=1;
CPOrdering[d]=2;
CPOrdering[c]=4;

虽然对于更复杂的例子,你应该比这更聪明 - 即使用模式匹配。

然后你可以使用

对表达式进行排序
In[5]:= CirclePlus[a,b,c,d]
SortBy[%,CPOrdering]
Out[5]= a\[CirclePlus]b\[CirclePlus]c\[CirclePlus]d
Out[6]= b\[CirclePlus]d\[CirclePlus]a\[CirclePlus]c

然后可以使用类似

的内容自动执行此操作
CPOrdering[a_, b_] := CPOrdering[a] < CPOrdering[b]
CirclePlus[a__] /; (!OrderedQ[{a}, CPOrdering]) := CirclePlus@@SortBy[{a}, CPOrdering]

答案 1 :(得分:2)

Mathematica中b+c+a+d成为a+b+c+d的根本原因是因为Plus具有属性Orderless。一般来说,带有属性f的符号Orderless表示ff[e1, e2, e3]的元素,ei元素应按照规范顺序排序,特别是,Mathematica的规范顺序与OrderedQOrdering相当。

在模式匹配期间甚至会考虑

Orderless

In[47]:= a+b+c+d /. a+c -> e
Out[47]= b+d+e

强烈建议您不要从Orderless中删除Plus属性,因为Mathematica中的许多功能可能会造成严重后果。

正如其他海报所指出的,最好的办法是简单地定义自己的非Orderless函数,从而保留参数顺序。您可能还会发现HoldForm在非常有限的情况下非常有用。

另请注意,只要您不进行就地评估等,就不会阻止您在笔记本中以任何顺序排版表达式中的符号。

答案 2 :(得分:1)

所以,不要使用“+”,因为Plus [] IS 可交换。

定义你自己的myPlus [x_,y _]:= ....无论如何。

如果你知道你的新Plus []应该做什么,请发布它,我们可能会尝试帮助你定义/

HTH!

PS&GT;您可以更改Plus []的定义......但是:)