Какой самый простой способ отобразить произвольно напуганный вложенный список expr
в функцию unflatten
, чтобы expr==unflatten@@Flatten@expr
?
Мотивация: Compile
могла обрабатывать толькополные массивы (что я только что узнал, но не из сообщения об ошибке), поэтому идея состоит в том, чтобы использовать unflatten
вместе со скомпилированной версией сглаженного выражения:
fPrivate=Compile[{x,y},Evaluate@Flatten@expr];
f[x_?NumericQ,y_?NumericQ]:=unflatten@@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},
Function@Evaluate@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}}}&