Mathematica地图问题

0 wolfram-mathematica map

原始问题:

我知道Mathematica有一个内置的地图(f,x),但这个功能是什么样的?我知道你需要查看列表中的每个元素.

任何帮助或建议?

编辑(由Jefromi,Mike的评论拼凑而成):

我正在开发一个程序,需要通过像Map这样的列表,但是我不允许使用它.我也不允许使用Table; 我需要在没有其他功能帮助的情况下浏览列表.我正在处理一个递归版本,我有一个空列表,但是在列表中包含其中的项目并没有成功.这是我的第一种情况:( newMap[#, {}] = {}空列表的地图只是一个空列表)

Mic*_*lat 6

我发布了一个递归解决方案,但后来又决定删除它,因为从评论中这听起来像是一个家庭作业问题,而且我通常是一个教导鱼人.

您正在使用定义的递归解决方案newMap[f_, {}] := {}.

Mathematica的模式匹配是你的朋友.考虑如何实现的定义newMap[f_, {e_}],并从那里newMap[f_, {e_, rest___}].

最后一个提示:一旦你可以定义最后一个函数,你实际上并不需要这个案例{e_}.

更新:

根据您的评论,这个例子可能会帮助您了解如何应用任意函数:

func[a_, b_] := a[b]

In[4]:= func[Abs, x]
Out[4]= Abs[x]
Run Code Online (Sandbox Code Playgroud)

由于OP捕获了一条鱼,可以这么说,(恭喜!)这里有两个递归解决方案,以满足任何旁观者的好奇心.第一个可能是我认为"惯用"的Mathematica:

map1[f_, {}] := {}
map1[f_, {e_, rest___}] := {f[e], Sequence@@map1[f,{rest}]}
Run Code Online (Sandbox Code Playgroud)

这种方法不能充分利用模式匹配,这基本上是OP最终的结果:

map2[f_, {}] := {}
map2[f_, lis_] :=  {f[First[lis]], Sequence@@map2[f, Rest[lis]]}
Run Code Online (Sandbox Code Playgroud)

{f[e], Sequence@@map[f,{rest}]}部分可以用各种等效方式表示,例如:

  • Prepend[map[f, {rest}], f[e]]
  • Join[{f[e]}, map[f, {rest}] (@Mike使用此方法)
  • Flatten[{{f[e]}, map[f, {rest}]}, 1]

我将把它留给读者再考虑一下,并思考大多数人的性能影响=)

最后,为了好玩,这是一个程序版本,即使写它让我有点恶心:;-)

map3[f_, lis_] :=
 (* copy lis since it is read-only *)
 Module[{ret = lis, i},
  For[i = 1, i <= Length[lis], i++,
   ret[[i]] = f[lis[[i]]]
   ];
  ret
  ]
Run Code Online (Sandbox Code Playgroud)

  • `_`是[`Blank`](http://reference.wolfram.com/mathematica/ref/Blank.html),并匹配任何表达式.`f_`实际上只是在函数定义中指定与局部变量`f`匹配的内容.阅读["模式简介"](http://reference.wolfram.com/mathematica/tutorial/Introduction-Patterns.html)教程可能会有所帮助. (2认同)