8
votes

Mathematica: reconstituer une liste imbriquée arbitraire après aplatir

Quel est le moyen le plus simple de mapper une liste imbriquée arbitraire funky expr code> à une fonction non contracturé code> de sorte que expr == impulatten @@ aplatten @ expr Code>?

Motivation: strong> compile code> ne peut gérer que des tableaux complets (quelque chose que je viens d'apprendre - mais pas à partir du message d'erreur), l'idée est donc d'utiliser non contracté code> avec une version compilée de la version aplatie Expression: p> xxx pré>

Exemple d'une solution à un problème moins général: strong> Ce que je dois faire, c'est de calculer tous les dérivés pour une fonction multivariée donnée jusqu'à une certaine commande. Pour ce cas, je tick mon chemin le long de la même manière: p> xxx pré>

Cela fonctionne, mais ce n'est ni élégant ni général. p>

EDIT: strong> Voici la version "Sécurité de l'emploi" de la solution fournie par AAZ: P>

In[2]= makeUnflatten[expr]
Out[2]= {#1,{#2,#3},{{#4,#5},{#6,#7}}}&


5 commentaires

Je ne l'ai pas testé, mais la modification du Rearrangeas peut fonctionner Stackoverflow.com/questions/4811082/...


Merci, Yaroslav: Cela semble certainement lié - mais c'est un peu difficile à grok :). J'ai fini par faire quelque chose que je posterai que je posterai si personne mord ... Même histoire toujours: 1) Résoudre le problème de votre cas spécifique, 2) Réalisez qu'une solution plus générale pourrait être amusante, 3) pour éviter de perdre du temps sur une tangente , postez-le de sorte que d'autres font votre travail tangentiel, 4) Faites-le vous-même aussi. Soupir


Cette question semble apparentée Stackoverflow.com/Questtions/3807976/...


@Yaroslav J'ai ajusté ma version à cette question et j'ai fini par trouver quelque chose de très similaire à la solution de @aaz, mais ce dernier est plus simple et plus élégant.


@dbjohn: merci. La question que vous mentionnez ne concerne que les "tableaux complets" - pour lesquels, incidemment, il n'y aurait pas besoin de ce piratage car Compile gère ceux-ci.


3 Réponses :


1
votes

Je ne suis pas sûr de ce que vous essayez de faire de la compilation. Il est utilisé lorsque vous souhaitez évaluer très rapidement des expressions procédurales ou fonctionnelles sur des valeurs numériques. Je ne pense donc pas que cela va aider ici. Si des calculs répétés de d [f, ...] empêchent vos performances, vous pouvez les précalcomputer et les stocker avec quelque chose comme table [d [k] = d [f, {{x, y}, k}], {k, 0, kk}];

Appelez simplement D [k] pour obtenir la dérivée KTH.


1 commentaires

Merci. Je suis tout à fait d'accord pour dire que je n'aurais pas besoin de compiler pour l'exemple du cas - mais je ne pense pas que quiconque me remercie de poster l'expression réelle avec laquelle je travaille :) Ma question est la première phrase, tout le reste est de fond.



6
votes

Vous devez évidemment enregistrer des informations sur la structure de la liste, car aplatit [{A, {b, c}}] == aplatir [{{a, b}, c}] . < P> Si arrayq [expr] , la structure de la liste est donnée par dimensions [expr] et vous pouvez le reconstruire avec la partition . Par exemple xxx

(la page de partition a un exemple similaire appelé non contracté .)


si expr n'est pas un tableau, vous pouvez essayer ceci: xxx


6 commentaires

Oui, j'ai utilisé le premier à plusieurs fois, mais la deuxième version est ce dont j'ai besoin - et très bien fait! Utiliser la fente [0] pour une récursion anonyme ne m'a jamais eu lieu :) Merci.


Je viens de découvrir sur emplacement [0] en écrivant ceci; C'est sous exemples soignés , évidemment :)


Est version documenté? Quelqu'un peut-il me guider dans des informations? J'utilise MMA 7 (M. Trott, dans la "programmation", dit qu'il est non documenté, mais ne donne aucune autre information, autant que je sache).


@Tomd - Sorte de . Ici, il fonctionne la même chose que évaluer .


@Tomd, @aaz: Quand j'ai vu la solution AAZ, je pensais que la libération était une fonction cool que j'avais manquée d'une manière ou d'une autre. Mais après l'avoir regardé, j'édite effectivement d'évaluer dans ma mise à jour sommaire :)


@Janus, @tomd - Je pensais toujours naturellement que "la libération" était l'antonyme de "Hold". Je suppose que c'est pourquoi il est obsolète depuis deux décennies, mais pas encore supprimé.



1
votes

Je voulais juste mettre à jour les excellentes solutions d'AAZ et Janus. Il semble que, du moins dans Mathematica 9.0.1.0 sur Mac OSX, la mission (voir la solution d'AAZ) xxx pré>

échoue. Si, cependant, nous utilisons p> xxx pré>

au lieu de cela, nous réussissons. La même chose détient, bien sûr, pour la version code> appelée code> dans la version "Sécurité de travail" de Janus. P>

Pour une bonne mesure, j'inclus ma propre fonction. P>

unflatten[ex_List, exOriginal_List] := 
  Module[
   {indexes, slots, unflat},
   indexes = 
     Module[
       {i = 0}, 
       If[ListQ[#1], Map[#0, #1], ++i] &@exOriginal
       ];
   slots = indexes /. {i_Integer :> Slot[i]};
   unflat = Function[Release[slots]];
   unflat @@ ex
   ];

(* example *)
expr = {a, {b, c}};
expr // Flatten // unflatten[#, expr] &


1 commentaires

L'original fonctionne toujours bien pour moi en V9. Le but de makeunflatten est tout à fait de stocker les informations sur la structure de Expr dans une fonction de décompression anonyme - il n'est donc pas nécessaire de garder l'expression originale.