Quel est le moyen le plus simple de mapper une liste imbriquée arbitraire funky Motivation: strong>
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> Cela fonctionne, mais ce n'est ni élégant ni général. p> expr code> à une fonction
non contracturé code> de sorte que
expr == impulatten @@ aplatten @ expr Code>?
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>
In[2]= makeUnflatten[expr]
Out[2]= {#1,{#2,#3},{{#4,#5},{#6,#7}}}&
3 Réponses :
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
Appelez simplement D [k] pour obtenir la dérivée KTH. P> table [d [k] = d [f, {{x, y}, k}], {k, 0, kk}]; code> p>
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.
Vous devez évidemment enregistrer des informations sur la structure de la liste, car (la page de partition si aplatit [{A, {b, c}}] == aplatir [{{a, b}, c}] code>. < P> Si
arrayq [expr] code>, la structure de la liste est donnée par
dimensions [expr] code> et vous pouvez le reconstruire avec la partition code>. Par exemple p>
code> a un exemple similaire appelé
non contracté code>.) P>
expr code> n'est pas un tableau, vous pouvez essayer ceci: p>
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] code> en écrivant ceci; C'est sous exemples soignés i>, évidemment :)
Est version code> 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 code>.
@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é.
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) échoue. Si, cependant, nous utilisons p> 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] &
L'original fonctionne toujours bien pour moi en V9. Le but de makeunflatten code> est tout à fait de stocker les informations sur la structure de
Expr code> dans une fonction de décompression anonyme - il n'est donc pas nécessaire de garder l'expression originale.
Je ne l'ai pas testé, mais la modification du
Rearrangeas CODE> > 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.