如何在mathematica中以与max或min相同的方式使用sort函数

时间:2011-01-14 00:51:13

标签: wolfram-mathematica

请查看以下代码:

Sort[{1, y, x}, Greater]
Max[{1, x, y}]
x = 1
y = 2
Sort[{1, y, x}, Greater]
Max[{1, x, y}]

值得注意的是,第一个Sort总是产生一个明确的结果,而第一个Max则没有,即使指定了Greater。注意我没有给出x和y的任何数值。为什么这样,我如何使Sort函数的行为与Max(或Min)函数的行为相同?

谢谢!

BTW,我正在使用Mma 7.0

2 个答案:

答案 0 :(得分:3)

来自帮助:

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]  

请注意

  1. 列表中的每个符号将被评估两次,一次用于检查它是否为数字,然后进行排序。这可以通过在获取NumericQ之前存储中间结果来规避。 编辑再次思考,我不太确定......也许其他人可以澄清这一点。

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

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

答案 1 :(得分:2)

在这种情况下,Greater无法评估,Sort似乎将未评估的比较函数视为评估为True,即以下结果相同

Sort[{a, c, d}, True &]
Sort[{a, c, d}, UndefinedFunction&]

至于为什么,它取决于内部,这是一个如何发生的例子

If[!compare[a,b],swap[a,b],dontswap[a,b]]

您看到compare评估为True而不评估具有相同的效果。通常,对TrueFalse以外的任何内容求值的布尔表达式都会产生不可预测的结果,因此您需要确保对布尔值进行求值。

以下是由此问题引起的confusion的另一个示例