代码之家  ›  专栏  ›  技术社区  ›  kirill_igum jfriend00

控制表达式中变量的顺序

  •  3
  • kirill_igum jfriend00  · 技术社区  · 14 年前

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

    注意,我想在+不可交换的地方使用它

    3 回复  |  直到 14 年前
        1
  •  5
  •   Simon    14 年前

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

    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]
    
        2
  •  2
  •   Michael Pilat    14 年前

    根本原因 b+c+a+d 变成 a+b+c+d 在数学中是因为 Plus 具有属性 Orderless . 一般来说,符号 f 带属性 无秩序的 意味着 f 在宣誓中 f[e1, e2, e3] 元素 ei 应该按照规范的顺序来分类,特别是,Mathematica的规范顺序相当于 OrderedQ Ordering .

    无秩序的

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

    强烈建议您不要删除 无秩序的 属性来自 加上 因为在Mathematica中,许多功能的结果可能是可怕的。

    正如其他海报所指出的,你最好的选择是简单地定义你自己的功能,而不是 无秩序的 从而保持论证顺序。你也可能会发现 HoldForm 在非常有限的情况下有用。

    另外要注意的是,只要不在适当的位置进行计算,任何事情都不会阻止您按照笔记本中所需的任何顺序在表达式中设置符号。

        3
  •  1
  •   Dr. belisarius    14 年前

    所以,不要使用“+”,因为加号[] 可交换的

    定义您自己的myplus[X_uuy_uuu]:=…无论什么。

    如果你知道你的新加号[]应该做什么,请张贴它,我们可能会尽力帮助你定义/

    嗯!

    PS>您可以更改加号[]的定义…但是:)