как использовать функцию сортировки так же, как Макс или Мин в Mathematica - PullRequest
2 голосов
/ 14 января 2011

Пожалуйста, взгляните на следующий код:

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

Интересно отметить, что первая сортировка всегда дает определенный результат, а первая максимальная - нет, даже если указан параметр Greater.Обратите внимание, я не дал никаких числовых значений для х и у.Почему это так и как я могу заставить функцию сортировки вести себя так же, как и функция Max (или Min)?

Спасибо!

Кстати, я использую Mma 7.0

Ответы [ 2 ]

3 голосов
/ 14 января 2011

Из справки:

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 и все аргументы которой являются числовыми величинами.В большинстве случаев NumericQ [expr] дает True всякий раз, когда N [expr] дает явное число.

  3. Изменяя NumericQ для StringQ или что угодно (или добавляя его в качестве параметра для sortN [], вы можете выбрать Type , который вы хотите форсировать и отсортировать.

2 голосов
/ 14 января 2011

В этом случае 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 что было вызвано этой проблемой

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...