Re: argMax

• To: mathgroup at smc.vnet.net
• Subject: [mg51290] Re: argMax
• From: "Peltio" <peltio at twilight.zone>
• Date: Tue, 12 Oct 2004 01:57:58 -0400 (EDT)
• References: <ckaj3i\$m3r\$1@smc.vnet.net> <ckd63b\$52f\$1@smc.vnet.net>
• Reply-to: "Peltio" <peltioNOSP at Mdespammed.com.invalid>
• Sender: owner-wri-mathgroup at wolfram.com

```"Peltio" wrote

>I've written this without any testing, so I can't tell whether it's faster
>or not than your solution (if it happens to be so, it won't be much faster,
>though).

>    ArgMax[f_, arglist_List] :=
>      Module[
>        {spectrum},
>        spectrum = f /@ arglist;
>        Flatten[Take[arglist, #] & /@ Position[spectrum, Max[spectrum]]]
>    ]

It is indeed a little bit faster, and this version is just a bit more so
(please note the numericization of the list, remove N[ ] if that is a
problem):

ArgMax[f_, arglist_List] :=
With[
{spectrum = N[f /@ arglist]},
Apply[arglist[[#]] & , Position[spectrum, Max[spectrum]], 1]
]

f[x_] := -x^2 + 7x
arglist = {-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
ArgMax[f, arglist]

>Or a multidimensional one, that can give you a list of coordinates of the
>points giving you a max.
>
>    ArgMax[f_, arglist_List] :=
>      Module[
>        {spectrum},
>        spectrum = Map[f, arglist, -1];
>        Take[arglist, #] & /@ Position[spectrum, Max[spectrum]]
>    ]
>

Sorry, this won't work. Try this instead for functions of several variables:

ArgMax[f_, arglist_List] :=
Module[
{newarg = Flatten[arglist, Depth[arglist] - 3], spectrum},
spectrum = N[Apply[f, newarg, {-2}]];
Apply[newarg[[#]] & , Position[spectrum, Max[spectrum]], 1]
]

f[x_, y_] := Sin[x] - Cos[3y]
{arglist = Flatten[Table[{x, y}, {x, 0, 3}, {y, 2, 4}], 1], ArgMax[f,
arglist]}
{arglist = Table[{x, y}, {x, 0, 3}, {y, 2, 4}], ArgMax[f, arglist]}

f[x_, y_, z_] := Sin[x] - Cos[3y] + z
{arglist = Table[{x, y, z}, {x, 0, 3}, {y, 2, 4}, {z, -1, 1}],
ArgMax[f, arglist]}

cheers,
Peltio