Wolfram mathematica Mathematica中二元函数的映射

Wolfram mathematica Mathematica中二元函数的映射,wolfram-mathematica,Wolfram Mathematica,我想存档: Map2[f,{a,b,c,d}] {f[a,b], f[b,c], f[c,d]} 但出于某种原因,我只能想到迭代方法 功能方式是什么 编辑: 使用这个,是为了生成图形示例。如果给定了数字列表,下面将生成它的含义图,以顺序访问所有节点 例如: Map2 = # @@@ Partition[#2, 2, 1] &; MG[elems_] := Graph[Map2[DirectedEdge, elems]] nrs = RandomInteger[{1, 15}, 20]

我想存档:

Map2[f,{a,b,c,d}]
{f[a,b], f[b,c], f[c,d]}
但出于某种原因,我只能想到迭代方法

功能方式是什么

编辑: 使用这个,是为了生成图形示例。如果给定了数字列表,下面将生成它的含义图,以顺序访问所有节点

例如:

Map2 = # @@@ Partition[#2, 2, 1] &;
MG[elems_] := Graph[Map2[DirectedEdge, elems]]
nrs = RandomInteger[{1, 15}, 20]
MG[nrs]
{10,13,9,7,13,3,5,1,15,10,15,6,14,3,1,2,11,4,8,5}

径向布局:

最简单的是:

Map2 = # @@@ Partition[#2, 2, 1] &;
或者,可能使用更少的内存,但运行速度稍慢:

Map2[f_, lst_] := Developer`PartitionMap[f @@ # &, lst, 2, 1]
另外,要注意和,它们是相关的


其他途径:

Inner[#, Most@#2, Rest@#2, 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}] &

现在,时间安排。我将利用这个机会

表左侧的数字是每次运行的实数列表的长度

请注意,该图是对数的

以下是处理最长列表(1000000)时使用的内存字节数:


在完成上述计时之后,我发现我可以通过消除
Apply
@
)使
f6
更快。它现在显然是长名单上最快的。我不会将其添加到上表中,因为它已经足够宽了,但下面是函数及其计时:

f7 = Table[#2[[i]] ~#~ #2[[i + 1]], {i, Length@#2 - 1}] &;
我喜欢:

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]}
正如在“将函数映射到移动子列表”中所述,可以使用以下函数优雅地解决此问题:

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]}

Wizard先生在这里,根据sakra的要求添加了比较时间


我最近重新阅读了你的问题,看到了你的
图形[]
应用程序

我认为这样做的自然方式是:

f[l_] := Graph[Thread[Most@l -> Rest@l]]
所以


遵循belisarius的指导,并解决您的
图形应用程序,这应该会快一点:

f = Inner[Rule, Most@#, Rest@#, Composition[Graph, List]] &;

哇,我看到了其他的解决方案,它们看起来非常复杂和混乱。这要简单得多,至少如果您喜欢功能性更强的方法:

MapApplyImpl[fun_] := Function[{args}, Apply[fun, args]]
MapApply[fun_, argList_] := Map[MapApplyImpl[fun], argList]
以及一个使用示例:

ff := Function[{t, phi}, t*phi]
MapApply[ff, {{0, Pi/4}, {(Pi/4)/(10^3) , 0}, {(2*Pi/(10^3)), 
   Pi/4}}]

@马格斯,我很高兴这有帮助。我的回答还没说完。还有其他方法,我想添加计时,所以请稍后再查看。@Mr.我将在我的答案中添加您的所有功能以报复:)@Mr.我对此表示不满:)。你忘了在考试中包括我唯一的贡献。我赢了吗?:)@先生,在我的分数中,使用
内部
的是最快的,删除的是第二名。@belisarius,更正。您使用的代码是相同的,还是不同的?我想知道在v8中
是否较慢。我知道我忘记了一些东西。:-)(抱怨模式)我自己投票支持这个方法,因为它很有帮助,但不是这里最好的方法。事实上,它比我给出的任何选项都慢。没有什么对你不利的,sakra,但我认为它不应该排名这么高。@Mr.Wizard你能把ListConvale选项添加到你的计时测试图中吗?sakra,我可以编辑你的帖子以包括一个比较图,还是你更愿意我不这样做?完成。观察
Map2
始终比简单的
f1
f3
通常比
f1
快,但它在10^5列表中有一个奇怪的摆动
f7
开始时速度很慢,但一旦自动编译开始,它很容易成为最快的。+1用于费心阅读更新后的问题,并给出一个很好的解决方案。@d00b必须是<代码>图形
不在v7中。@d00b:是的,此用例适用于Mathematica 8。尽管值得注意,这个问题本身并不是特定于版本的。我认为,作为当前显示有向图的应用程序,速度是否如此重要值得怀疑。巨大的图形几乎难以辨认:)+1@belisarius我以为
图形
用于其他东西,而不仅仅是显示。不无论如何,谢谢你的+1。我更喜欢你的解决方案。从问题的上下文来看,展示似乎是客观的,但你很可能是对的。
MapApplyImpl[fun_] := Function[{args}, Apply[fun, args]]
MapApply[fun_, argList_] := Map[MapApplyImpl[fun], argList]
ff := Function[{t, phi}, t*phi]
MapApply[ff, {{0, Pi/4}, {(Pi/4)/(10^3) , 0}, {(2*Pi/(10^3)), 
   Pi/4}}]