Il est probablement fonction intégrée ou une meilleure et plus rapide de le faire dans MathematicaY at-il une fonction standard pour cela?
func[l_, g_, f_] := g @@ f @@@ Transpose[{Most[l], Rest[l]}]
qui peut être utilisé pour faire des choses comme ça
l = {a, b, c, d}
func[l, Plus, (#1 - #2)^2 &]
Je ne sais pas le bon nom pour ce genre de fonction. Quelque chose dans un genre de pli-zip.
MISE À JOUR Beaucoup de solutions. Merci à tout le monde.
En utilisant
Partition[l, 2, 1]
au lieu de
Transpose[{Most[l], Rest[l]}]
rend certainement plus clair.
J'ai essayé de courir timings sur les fonctions, mais je reçois des résultats étranges:
func1[l_, g_, f_] := g @@ f @@@ Transpose[{Most[l], Rest[l]}]
func2[l_, g_, f_] := g @@ f @@@ Partition[l, 2, 1]
func3[l_, g_, f_] := g @@ ListConvolve[{1, 1}, l, {-1, 1}, {}, Times, f]
func4[l_, g_, f_] := g @@ Thread[f[[email protected], [email protected]]]
func5[l_, g_, f_] := g @@ f /@ Partition[l, 2, 1]
func6[l_, g_, f_] := g @@ Thread[f[Most[l], Rest[l]]]
func7[l_, f_, g_] := Inner[f, Sequence @@ Partition[l, Length[l] - 1, 1], g]
func8[l_, g_, f_] := g @@ MapThread[f, Partition[l, Length[l] - 1, 1]]
functions = {func1, func2, func3, func4, func5, func6, func7, func8}
input = Table[ToExpression["x" <> ToString[i]], {i, 1, 1000000}];
inputs = Table[Take[input, i*100000], {i, 1, 10}];
Table[
If[i == j == 0, "",
If[j == 0, functions[[i]],
If[i == 0, Length[inputs[[j]]],
Timing[functions[[i]][inputs[[j]]]][[1]]]]],
{i, 0, Length[functions]}, {j, 0, Length[inputs]}] // Transpose // TableForm
Juste un commentaire OT. Pour générer votre grande liste 'input', il est plus rapide d'utiliser' Table [Symbol ["x" <> ToString [i]], {i, 1000000}] 'ou' Array [Symbol ["x" <> ToString [#] ] &, 1000000] 'que' ToExpression [...] '. – Simon
Merci! Je ne le savais pas. – Max