Map-Thread-Through-Apply a list of functions onto a list of (lists of) values
How about:
Inner[#2@#1 &, list, fns, List, 2]
or
Inner[Compose, fns, Transpose@list, List] (* Note, that Compose is obsolete *)
or
MapIndexed[fns[[Last@#2]]@#1 &, list, {2}]
or
ListCorrelate[{fns}, list, {1, -1}, {}, Compose, Sequence]
or
MapThread[Compose, {Array[fns &, Length@list], list}, 2]
or
ReplacePart[list, {i_, j_} :> fns[[j]][list[[i, j]]]]
or
list // Query[All, Thread[Range@Length@fns -> fns]]
or (cheating a little)
list // Query[All, {1 -> f, 2 -> g, 3 -> h}]
What about
Map[MapThread[Compose, {fns, #}] &, list]
or
Transpose@MapThread[Map, {fns, Transpose[list]}]
The OP said: "I know a few methods, but I'm looking for more." so here are my offerings for the sake of interest. The second is intentionally a bit convoluted. The third may actually be of interest as the method could be used for in-place modification.
With[{op = MapIndexed[#[Slot @@ #2] &, fns]}, op & @@@ list]
Fold[RotateLeft@MapAt[#2, #, 1] &, list\[Transpose], Function[x, x /@ # &] /@ fns]\[Transpose]
Module[{x = list\[Transpose]}, Table[x[[i]] = fns[[i]] /@ x[[i]], {i, Length@x}]; x\[Transpose]]
Or for in-place modification:
With[{x = list}, Table[x[[All, i]] = fns[[i]] /@ x[[All, i]], {i, Length@First@x}]; x]
This post is primarily to provide the service of comparative timings. I will be using Mathematica 7.
Timings using an array of 1.5 million Integers and three inert symbolic heads:
fns = {f, g, h};
list = RandomInteger[1*^6, {500000, 3}];
times = timeAvg[#[]] & /@ methods;
BarChart[MapThread[Labeled, {times, methods}]]
Using an array of Reals and three trig functions:
fns = {Sin, Cos, Csc};
list = RandomReal[1*^6, {500000, 3}];
times = timeAvg[#[]] & /@ methods;
BarChart[MapThread[Labeled, {times, methods}]]
To explore performance with different shapes here is as above but with 500 random trig functions:
fns = RandomChoice[{Sin, Cos, Sec, Csc, Tan}, 500];
list = RandomReal[1*^6, {5000, 500}];
times = timeAvg[#[]] & /@ methods;
BarChart[MapThread[Labeled, {times, methods}]]
Functions as I named and used them:
SetAttributes[timeAvg, HoldFirst]
timeAvg[func_] :=
Do[If[# > 0.3, Return[#/5^i]] & @@ Timing@Do[func, {5^i}], {i, 0, 15}]
leonid1[] := Map[MapThread[Compose, {fns, #}] &, list]
leonid2[] := Transpose@MapThread[Map, {fns, Transpose[list]}]
rm1[] := Replace[list, x_List :> MapIndexed[fns[[First@#2]]@#1 &, x], {1}]
rm2[] := MapIndexed[fns[[First@#2]]@#1 &, #] & /@ list
kguler1[] := Inner[#1@#2 &, fns, #, List] & /@ list
kguler2[] := Inner[Compose, fns, #, List] & /@ list
wreach1[] := Inner[#2@#1 &, list, fns, List, 2]
wreach2[] := MapIndexed[fns[[Last@#2]]@#1 &, list, {2}]
wreach3[] := ListCorrelate[{fns}, list, {1, -1}, {}, Compose, Sequence]
wreach4[] := MapThread[Compose, {Array[fns &, Length@list], list}, 2]
wizard1[] := With[{op = MapIndexed[#[Slot @@ #2] &, fns]}, op & @@@ list]
wizard2[] := Fold[RotateLeft@MapAt[#2, #, 1] &, list\[Transpose], Function[x, x /@ # &] /@ fns]\[Transpose]
wizard3[] := Module[{x = list\[Transpose]}, Table[x[[i]] = fns[[i]] /@ x[[i]], {i, Length@x}]; x\[Transpose]]
methods = {leonid1, leonid2, rm1, rm2, kguler1, kguler2, wreach1,
wreach2, wreach3, wreach4, wizard1, wizard2, wizard3};