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]
请注意
在这种情况下,
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)花环这是一个真正的改进。谢谢!我认为这种排序行为的原因是,当比较函数不可靠时,它有助于稳定排序。