¿Cuál es la forma más simple de asignar una lista anidada arbitrariamente funky expr
a una función unflatten
de modo que [email protected]@[email protected]
?Mathematica: reconstruir una lista anidada arbitraria después de Flatten
motivación: Compile
sólo puede manejar matrices completas (algo que acaba de aprender - pero no del mensaje de error), por lo que la idea es utilizar unflatten
junto con una versión compilada de la expresión aplanado:
fPrivate=Compile[{x,y},[email protected]@expr];
f[x_?NumericQ,y_?NumericQ]:[email protected]@fPrivate[x,y]
Ejemplo de una solución a un problema menos general: Lo que en realidad lo que necesito hacer es calcular todas las derivadas de una función multivariable renunciado a algún orden. Para este caso, me hackeo mi camino a lo largo de esta manera:
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}}} &
Esto funciona, pero no es ni elegante ni general.
Editar: Aquí está la versión "seguridad en el empleo" de la solución proporcionada por aaz:
makeUnflatten[expr_List]:=Module[{i=1},
[email protected]@ReplaceAll[
If[ListQ[#1],Map[#0,#1],i++]&@expr,
i_Integer-> Slot[i]]]
Funciona a las mil maravillas:
In[2]= makeUnflatten[expr]
Out[2]= {#1,{#2,#3},{{#4,#5},{#6,#7}}}&
No lo probé, pero la modificación de 'rearrangeAs' de Leonid Shifrin podría funcionar http://stackoverflow.com/questions/4811082/applying-transformation-of-gatherby-to-a-different-list/4811794# 4811794 –
Gracias, Yaroslav: Eso ciertamente parece relacionado, pero es un poco difícil de asimilar :). Terminé haciendo algo yo mismo que publicaré si nadie muerde ... La misma historia siempre: 1) resuelve el problema para tu caso específico, 2) te das cuenta de que una solución más general podría ser divertida, 3) para evitar perder el tiempo en la tangente , publíquelo en SO para que otros realicen su trabajo tangencial, 4) hágalo usted mismo también. Suspiro – Janus
Esta pregunta parece relacionada http://stackoverflow.com/questions/3807976/inverse-of-flatten-in-mathematica – dbjohn