Mar*_*gus 12 wolfram-mathematica
我想存档:
Map2[f,{a,b,c,d}]
{f[a,b], f[b,c], f[c,d]}
Run Code Online (Sandbox Code Playgroud)
但出于某种原因,我只能想到迭代方法.
什么是功能方式?
使用这个,就是生成图表示例.如果给出了数字列表,则下面生成它意味着什么的图表,以顺序访问所有节点.
例如:
Map2 = # @@@ Partition[#2, 2, 1] &;
MG[elems_] := Graph[Map2[DirectedEdge, elems]]
nrs = RandomInteger[{1, 15}, 20]
MG[nrs]
Run Code Online (Sandbox Code Playgroud)
{} 10,13,9,7,13,3,5,1,15,10,15,6,14,3,1,2,11,4,8,5
径向布局:

Mr.*_*ard 11
最简单的:
Map2 = # @@@ Partition[#2, 2, 1] &;
Run Code Online (Sandbox Code Playgroud)
或者,可能使用更少的内存,但运行速度稍慢:
Map2[f_, lst_] := Developer`PartitionMap[f @@ # &, lst, 2, 1]
Run Code Online (Sandbox Code Playgroud)
另外,要注意Differences和Accumulate哪些相关.
其他方法:
Inner[#, Most@#2, Rest@#2, List] &
Run Code Online (Sandbox Code Playgroud)
请注意,在这一个List可能是一个不同的功能.
MapThread[#, {Most@#2, Rest@#2}] &
Most@MapThread[#, {#2, RotateLeft@#2}] &
Rest@MapThread[#, {RotateRight@#2, #2}] &
Table[# @@ #2[[i ;; i + 1]], {i, Length@#2 - 1}] &
Run Code Online (Sandbox Code Playgroud)
现在,时间安排.我会利用蒂莫的timeAvg.
f1 = # @@@ Partition[#2, 2, 1] &;
f2[f_, lst_] := Developer`PartitionMap[f @@ # &, lst, 2, 1]
f3 = Inner[#, Most@#2, Rest@#2, List] &;
f4 = MapThread[#, {Most@#2, Rest@#2}] &;
f5 = Most@MapThread[#, {#2, RotateLeft@#2}] &;
f6 = Table[# @@ #2[[i ;; i + 1]], {i, Length@#2 - 1}] &;
timings =
Table[
list = RandomReal[99, 10^i];
func = Plus;
timeAvg[#[func, list]] & /@ {f1, f2, f3, f4, f5, f6},
{i, 6}
];
TableForm[timings,
TableHeadings -> {10^Range@6, {"f1", "f2", "f3", "f4", "f5", "f6"}}]
ListLogPlot[timings\[Transpose], Joined -> True]
Run Code Online (Sandbox Code Playgroud)


表格左侧的数字是每次运行的实数列表的长度.
请注意,图形是对数的.
以下是处理最长列表(1,000,000)时使用的内存字节数:

完成上述时间后,我发现我可以f6通过消除Apply(@@)来加快速度.它现在显然是较长列表中最快的.我不会将它添加到上面的表中,因为它已经足够宽了,但这里是函数及其时间:
f7 = Table[#2[[i]] ~#~ #2[[i + 1]], {i, Length@#2 - 1}] &;
Run Code Online (Sandbox Code Playgroud)

正如在Mathematica食谱中所解释的那样,使用ListConvole函数可以优雅地解决移动子列表上的函数:
Map2[f_, l_List] := ListConvolve[{1, 1}, l, {-1, 1}, {}, #2 &, f]
In[11]:= Map2[f, {a, b, c, d}]
Out[11]= {f[a, b], f[b, c], f[c, d]}
Run Code Online (Sandbox Code Playgroud)
Mr.Wizard在这里,按照sakra的要求添加比较时间.


我喜欢:
Map2[f_, l_List]:= MapThread[f, {Most@l, Rest@l}]
In[988]:= Map2[f,{a,b,c,d}]
Out[988]= {f[a,b],f[b,c],f[c,d]}
Run Code Online (Sandbox Code Playgroud)
我最近重新阅读了您的问题并看到了您的Graph[ ]申请.
我认为这样做的自然方式是:
f[l_] := Graph[Thread[Most@l -> Rest@l]]
Run Code Online (Sandbox Code Playgroud)
所以
f[{10, 13, 9, 7, 13, 3, 5, 1, 15, 10, 15, 6, 14, 3, 1, 2, 11, 4, 8, 5}]
Run Code Online (Sandbox Code Playgroud)
