Mathematica имеет встроенную функцию ArgMax для функций над бесконечными доменами, основанную на стандартное математическое определение.
Аналог для конечных доменов является удобной функцией полезности. Учитывая функцию и список (назовите это доменом функции), верните элемент списка, который максимизирует функцию. Здесь приведен пример конечного argmax в действии: Канонизировать имена команд НФЛ
И здесь моя реализация (наряду с argmin для хорошей меры):
(* argmax[f, domain] returns the element of domain for which f of
that element is maximal -- breaks ties in favor of first occurrence. *)
SetAttributes[{argmax, argmin}, HoldFirst];
argmax[f_, dom_List] := Fold[If[f[#1]>=f[#2], #1, #2]&, First[dom], Rest[dom]]
argmin[f_, dom_List] := argmax[-f[#]&, dom]
Во-первых, это самый эффективный способ реализации argmax? Что делать, если вам нужен список всех максимальных элементов, а не только первый?
Во-вторых, как насчет связанной функции posmax, что вместо возврата максимального элемента (ов) возвращается позиция максимальных элементов?