Wolfram mathematica 如何使用mathematica中与max或min相同的排序函数

Wolfram mathematica 如何使用mathematica中与max或min相同的排序函数,wolfram-mathematica,Wolfram Mathematica,请查看以下代码: Sort[{1, y, x}, Greater] Max[{1, x, y}] x = 1 y = 2 Sort[{1, y, x}, Greater] Max[{1, x, y}] 值得注意的是,第一个排序总是产生一个确定的结果,而第一个最大值则不会,即使指定了更大的值。注:我没有给出x和y的任何数值。这是为什么?我如何使排序函数的行为方式与最大(或最小)函数相同 谢谢 顺便说一句,我正在使用Mma 7.0,其帮助如下: Sort orders symbols by the

请查看以下代码:

Sort[{1, y, x}, Greater]
Max[{1, x, y}]
x = 1
y = 2
Sort[{1, y, x}, Greater]
Max[{1, x, y}]
值得注意的是,第一个排序总是产生一个确定的结果,而第一个最大值则不会,即使指定了更大的值。注:我没有给出x和y的任何数值。这是为什么?我如何使排序函数的行为方式与最大(或最小)函数相同

谢谢

顺便说一句,我正在使用Mma 7.0,其帮助如下:

Sort orders symbols by their names, and in the event of a tie, by their context  
所以,您需要的是另一个函数,而不是Sort[]

编辑

以下是一种在您的前提下仅强制进行数字排序的方法:

sortN[s_, f_: (OrderedQ[{#1, #2}] &)] :=

 (*Check if everything is eval to a number*)
 If[And @@ (NumericQ /@ s),

  (*and then sort*)
  Sort[s, f],

  (*if something not numeric,
  reconstruct the function call and return it*)
  If[(ToString[f] == ToString[OrderedQ[{#1, #2}] &]), 
    Print[Unevaluated[sortN[s]]], Print[Unevaluated[sortN[s, f]]]];]
用法:

In[120]:= sortN[{3,2,1,4}]
Out[120]= {1,2,3,4}

In[121]:= sortN[{3,2,1,Sin}]
Out[121]= sortN[{3,2,1,Sin}]

In[122]:= sortN[{1,2,3,4},Greater]
Out[122]= {4,3,2,1}

In[123]:= sortN[{1,2,3,Log},Greater]
Out[123]= sortN[{1,2,3,Log},Greater]  
请注意

  • 列表中的每个符号将被计算两次,一次用于检查它是否是数字,然后用于排序。这可以通过在获取数字Q之前存储中间结果来避免编辑再想想,我不太确定。。。也许其他人可以澄清这一点

  • 如果表达式是一个显式数字或一个数学常数(如Pi),或者是一个具有属性NumericFunction且所有参数均为数值的函数,则该表达式被视为数值量。在大多数情况下,只要N[expr]产生一个显式数字,NumericQ[expr]就会给出True

  • 通过更改StringQ的NumericQ或您想要的任何内容(或将其添加为sortN[]的参数),您可以选择要强制和排序的类型


  • 在这种情况下,
    Greater
    无法求值,而
    Sort
    似乎将未求值的比较函数视为求值为
    True
    ,即以下给出了相同的结果

    Sort[{a, c, d}, True &]
    Sort[{a, c, d}, UndefinedFunction&]
    
    至于原因,这取决于内部,这里有一个例子说明了它是如何发生的

    If[!compare[a,b],swap[a,b],dontswap[a,b]]
    
    您可以看到,
    求值与
    进行比较,而不求值具有相同的效果。通常,对除
    之外的任何对象求值的布尔表达式都会产生不可预知的结果,因此您需要确保布尔值得到求值


    下面是由这个问题引起的另一个例子

    那么什么函数呢?如果Mma 7.0中没有函数,我怎么写我自己的呢?谢谢!@Qiang在编辑中发布了一个例子。使用sortN[]就像使用Sort[]一样,你可以避免sortN中的“重建”步骤,如下所示(为了简单起见忽略评估泄漏):sortN[s,f:(OrderedQ)[{#1,#2}]&]:=Sort[s,f]/;和@@(NumericQ/@s)花环这是一个真正的改进。谢谢!我认为这种排序行为的原因是,当比较函数不可靠时,它有助于稳定排序。