Mathematicaには、最終結果や単一の一致だけでなく、すべての結果を返す関数がいくつかあります。このような関数の名前は*List
です。示す:
- FoldList
- NestList
- ReplaceList
- ComposeList
私が見逃しているのはMapList関数です。
たとえば、次のようにします。
MapList[f, {1, 2, 3, 4}]
{{f [1]、2、3、4}、{1、f [2]、3、4}、{1、2、f [3]、4}、{1、2、3、f [4 ]}}
関数のアプリケーションごとにリスト要素が必要です。
MapList[
f,
{h[1, 2], {4, Sin[x]}},
{2}
] // Column
{h [f [1]、2]、{4、Sin [x]}} {h [1、f [2]]、{4、Sin [x]}} {h [1、2]、{f [4]、Sin [x]}} {h [1、2]、{4、f [Sin [x]]}}
これを次のように実装できます。
MapList[f_, expr_, level_: 1] :=
MapAt[f, expr, #] & /@
Position[expr, _, level, Heads -> False]
ただし、それは非常に非効率的です。この単純なケースを考えて、これらのタイミングを比較してください。
a = Range@1000;
#^2 & /@ a // timeAvg
MapList[#^2 &, a] // timeAvg
ConstantArray[#^2 & /@ a, 1000] // timeAvg
0.00005088
0.01436
0.0003744
これはMapList
、関数をリスト内のすべての要素にマッピングして1000x1000配列を作成する合計よりも、平均して約38倍遅いことを示しています。