2010-11-16 5 views
2

j'ai souvent besoin d'extraire de limiter les listes de valeurs à des sous-listes, à savoir si vals donne des valeurs de vars={x1,x2,x3,x4}, et j'ai besoin des valeurs de svars={x2,x4} je restrict[list,vars,svars]question Notation personnalisée

restrict[vars_, svars_, vals_] := 
Extract[vals, Flatten[Position[vars, #] & /@ svars, 1]] 

J'aimerais améliorer le code la lisibilité, peut-être en définissant la notation suivante personnalisée pour restrict[vars,svars,vals]

http://yaroslavvb.com/upload/custom-notation.png

Mes questions sont

  1. Quelle est une bonne façon de mettre en œuvre cela?
  2. Est-ce une bonne idée?

Répondre

4

bonnes notations peuvent être très utiles - mais je ne suis pas sûr que celui-ci en particulier est nécessaire ...

Cela dit, le paquet Notation rend ce assez facile. Comme il y a beaucoup de boîtes cachées lorsque vous utilisez la palette de notation, je vais utiliser une capture d'écran: alt text

Vous pouvez voir les NotationMake* downvalues ​​sous-jacents construisent en utilisant l'option Action -> PrintNotationRules. Dans [4] dans la capture d'écran génère

NotationMakeExpression[ 
    SubscriptBox[vals_, RowBox[{vars_, "|", svars_}]], StandardForm] := 
MakeExpression[ 
    RowBox[{"restrict", "[", RowBox[{vars, ",", svars, ",", vals}], 
    "]"}], StandardForm] 

NotationMakeBoxes[Subscript[vals_, vars_ | svars_], StandardForm] := 
SubscriptBox[MakeBoxes[vals, StandardForm], 
    RowBox[{Parenthesize[vars, StandardForm, Alternatives], "|", 
    Parenthesize[svars, StandardForm, Alternatives]}]] 
+0

question connexe, comment faire J'arrive à la Notation Palette? J'ai trouvé un lien dans l'un des tutoriels, mais ce n'est pas dans le menu de ma Palette. –

+0

Fourni 'Notation'AutoLoadNotationPalette == True' il devrait s'ouvrir automatiquement quand vous avez besoin de" Notation ". Si ce n'est pas le cas, vous pouvez l'ouvrir depuis 'ToFileName [{$ InstallationDirectory," AddOns "," Packages "," Notation "," LocalPalettes "," English "}," "]' et/ou l'installer à partir du Menu Palette – Simon

3

En ce qui concerne 2: Je passerais la liste des règles Thread[vars -> vals] au lieu de garder la trace des noms et des valeurs séparément.
Un de mes idiomes Mathematica préférés est d'utiliser des listes de règles avec WithRules comme défini ci-dessous: Cette construction évalue une expression dans un bloc With où tous les symboles de remplacement ont été (récursivement définis). Cela vous permet de faire des choses comme

WithRules[{a -> 1, b -> 2 a + 1}, b] 

et vous mène assez loin vers des arguments nommés.

SetAttributes[WithRules, HoldRest] 
WithRules[rules_, expr_] := Module[{notSet}, Quiet[ 
    With[{args = Reverse[rules /. Rule[a_, b_] -> notSet[a, b]]}, 
     Fold[With[{#2}, #1] &, expr, args]] /. notSet -> Set, 
    With::lvw]] 

Edit: La construction WithRules est basée sur ces deux fils de usenet (grâce à Simon pour les déterrer):

+0

C'est une utilisation similaire à http://stackoverflow.com/questions/4152194/automatically-generating-sums-in-mathematica/4152797#4152797. IE, je somme f1 (x1, x2) * f2 (x2, x3) sur x1, x2, x3 où les arguments de fi sont stockés dans args [fi] –

+1

OK, donc ce n'est probablement pas si utile alors. Pourtant, c'est mon truc préféré, donc n'importe quelle excuse fera pour l'afficher :) – Janus

+0

C'est une bonne astuce. Je me souviens d'une méthode similaire discutée dans [ce poste de maths] (https://groups.google.com/group/comp.soft-sys.math.mathematica/browse_thread/thread/6fa6b0ad9d5d111c). – Simon