将任意时髦的嵌套列表expr
映射到函数unflatten
以便[email protected]@[email protected]
的最简单方法是什么?Mathematica:在拼合之后重建任意的嵌套列表
动机: Compile
只能处理全阵列(这是我刚刚学会 - 但不是从错误信息),这样的想法是与扁平式的编译版本一起使用unflatten
:
fPrivate=Compile[{x,y},[email protected]@expr];
f[x_?NumericQ,y_?NumericQ]:[email protected]@fPrivate[x,y]
解决一个少一般问题的例子: 我真正需要做的是计算所有衍生品对于给定的多元函数达到某种秩序。对于这种情况,我按照如下方式破解了我的方式:
expr=Table[D[x^2 y+y^3,{{x,y},k}],{k,0,2}];
unflatten=Module[{f,x,y,a,b,sslot,tt},
tt=Table[D[f[x,y],{{x,y},k}],{k,0,2}] /.
{Derivative[a_,b_][_][__]-> x[a,b], f[__]-> x[0,0]};
(Evaluate[tt/.MapIndexed[#1->sslot[#2[[1]]]&,
Flatten[tt]]/. sslot-> Slot]&) ]
Out[1]= {x^2 y + y^3, {2 x y, x^2 + 3 y^2}, {{2 y, 2 x}, {2 x, 6 y}}}
Out[2]= {#1, {#2, #3}, {{#4, #5}, {#5, #7}}} &
这样的工作,但它既不优雅也不普遍。
编辑:这里是AAZ提供的解决方案中的“就业保障”的版本:
makeUnflatten[expr_List]:=Module[{i=1},
[email protected]@ReplaceAll[
If[ListQ[#1],Map[#0,#1],i++]&@expr,
i_Integer-> Slot[i]]]
它的工作原理魅力:
In[2]= makeUnflatten[expr]
Out[2]= {#1,{#2,#3},{{#4,#5},{#6,#7}}}&
我没有测试它,但狮子座希夫林的修改`rearrangeAs`可能工作http://stackoverflow.com/questions/4811082/applying-transformation-of-gatherby-to-a-different-list/4811794# 4811794 – 2011-02-15 08:05:02
谢谢,雅罗斯拉夫:这当然看起来相关 - 但有点难以理解:)。我最终做了一件我自己的事情,如果没有人咬我就会发布......总是有同样的故事:1)为你解决特定情况的问题,2)认识到一个更普遍的解决方案可能很有趣,3)避免浪费时间在切线上,把它张贴在SO上,让别人去做你的切线工作,4)自己去做。叹息 – Janus 2011-02-15 08:49:11
这个问题似乎相关http://stackoverflow.com/questions/3807976/inverse-of-flatten-in-mathematica – dbjohn 2011-02-15 12:15:11