请查看以下代码:
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
答案 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]
请注意
列表中的每个符号将被评估两次,一次用于检查它是否为数字,然后进行排序。这可以通过在获取NumericQ之前存储中间结果来规避。 编辑再次思考,我不太确定......也许其他人可以澄清这一点。
如果表达式是显式数字或数学常量(如Pi),或者是具有属性NumericFunction且其所有参数都是数字量的函数,则表达式被视为数字量。在大多数情况下,只要N [expr]产生一个显式数字,NumericQ [expr]就会给出True。
通过更改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
而不评估具有相同的效果。通常,对True
或False
以外的任何内容求值的布尔表达式都会产生不可预测的结果,因此您需要确保对布尔值进行求值。
以下是由此问题引起的confusion的另一个示例