在Mathematica中,您如何改变变量的重要性顺序?例如:如果我输入b + c + a + d,我得到一个+ b + c + d但我希望b和d先于其他变量。所以我得到b + d + a + c
请注意,我想在+非交换的地方使用它
答案 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
表示f
中f[e1, e2, e3]
的元素,ei
元素应按照规范顺序排序,特别是,Mathematica的规范顺序与OrderedQ
和Ordering
相当。
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 []的定义......但是:)