10
votes

Variables souscrites

Y a-t-il un moyen de forcer Mathematica à traiter des variables souscrites indépendamment de leurs contreparties non sautes? Plus précisement. Dis, j'ai les définitions suivantes: xxx pré>

maintenant lorsque j'utilise p> xxx pré>

mathematica substituera avec p>

Subscript[{{1, 2}, {3, 4}},1]


0 commentaires

6 Réponses :


1
votes

Le symbole est B code>, et pas indice [B, _] code>.

Lorsque vous définissez: p>

f[b, 1]
->f[{{1, 2}, {3, 4}}, 1]


5 commentaires

Bien sûr, je me demande quelle magie interne le paquet de notation utilise réellement pour atteindre ce qu'il fait? Par exemple, qu'est-ce que symbolise fait réellement?


@Simon ha! J'ai posté et supprimé ensuite un commentaire similaire sur votre réponse. Ce genre de choses me fait frémir :)


Ce ne serait pas si mauvais - sauf que symbole est verrouillé - ce qui vous empêche de lui donner Extra Makeboxes Définitions. Voir le Wiki communautaire "Réponse" J'ai publié ci-dessous.


@Simon, je pense que votre réponse est très gentille, mais je doute de la robustesse du tout. Lorsque vous voulez qu'un Calc fait que MMA soit génial, mais l'environnement en soi semble fragile et le processus de débogage (dure seul) est généralement plus difficile chaque fois que vous ajoutez un niveau d'abstraction / redéfinition.


La réponse a de graves problèmes - je ne le posais que pour que d'autres personnes puissent se termine en la fixant pour moi!



1
votes

pourrait utiliser la notation de l'emballage du même nom.

Ne vous dérange pas du code ci-dessous, vous ne comprenez pas la structure de la randonnée. Il suffit d'utiliser le modèle de palette et tapez l'indice de [B, J_] dans le côté gauche et, par exemple, BB [J_], dans la droite. Donc, les variables "réelles" sont maintenant bb [1], etc., et vous pouvez affecter en toute sécurité à b. P> xxx pré>

out [3] = {{1, 2}} p>

out [4] = {{3, 4}} p>

out [5] = {{1, 2}, {3, 4}} p>

Subscript[b, 1]


7 commentaires

@Daniel comme il devrait être évident de ma réponse, je n'ai jamais fait. :)


Bonjour Daniel: Le paquet de notation a une commande appelée symbolise conçu pour faire ce que Max voulait. La commande pleine notation n'est pas nécessaire.


Le problème potentiel avec la notation personnalisée est que le mécanisme d'analyse des fichiers .nb et .m est différent. Il provoque définitivement un problème d'infixnotation ( groupes.google.com/forum/#!msg/comp.soft-sys.math.mathematic A / ... ), pas sûr de symboliser


@Daniel je suis perplexe par votre réponse. Si vous entrez Indice [B, 1] Vous obtiendrez effectivement {{1,2}} comme sortie. Mais si vous entrez la même chose formatée comme indice d'indice, c'est-à-dire. B + Control [-], vous obtiendrez un résultat bien rendu de indice [{{1,2}, {3,4}}, 1] en retour.


@David: essayez d'utiliser la commande NOTATION [PARSEDBOXWRAPPER [\ (B \ _J_ \ \)] \ [DOUBLELONGLEFTRUCTION] PARSEDBOXWRAPPER [\ (BB [J _] \)]]] .


@David Cela fonctionne pour moi, tant que vous ne mélangez pas l'indice [B, 1] et B_1 (_ indiquant l'inscription). Donc, b_1 = {{1, 2}}; b_2 = {{3, 4}} b = jointure [b_1, b_2] fonctionne, mais b_1 = {{1, 2}}; b_2 = {{3, 4}} b = jointure [indice [B, 1], indice [B, 2]] (sur un noyau propre) rendements b [1, 2]


@Simon merci, ça marche. Maintenant, je vais essayer de comprendre pourquoi. Je me réfléchirai à votre code et à Sjoerd.



13
votes

Réponse à une réponse à une question précédente, Notation Mathematica et mods de syntaxe , Telefunkenvf14 mentionné qu'il était

dans l'espoir d'utiliser des notations pour forcer la MMA Pour traiter les variables souscrites comme symbole p> blockQuote>

qui est essentiellement quelle concerne cette question. P>

Wrach a souligné que le Package de notation peut le faire tout simplement en utilisant symboliser code> p> xxx pré>

où (comme dans la réponse de Daniel) ne vous inquiétez pas trop sur la structure code> de la case code> ci-dessus, car vous pouvez utiliser NOTATION CODE> PALETTE POUR ENTRÉEZ CETTEURE EN PLUS. P>

Vérifiez que tout fonctionne comme recherché: P>

In[6]:= Subscript[b, 1] = {{1, 2}}
        Subscript[b, 2] = {{3, 4}}
        b = Join[Subscript[b, 1], Subscript[b, 2]]
Out[6]= {{1, 2}}
Out[7]= {{3, 4}}
Out[8]= {{1, 2}, {3, 4}}


0 commentaires

2
votes

Si vous ne voulez pas utiliser le package code> notation code> (voir Daniel's et Mes Réponses), mais je veux copier le comportement de symboliser , alors ça devient un peu délicat.

Je suis allé faire cela après que je lisais ce Alors répondez une> mais courut dans des problèmes et abandonna. Je vais mettre le code ici en tant que wiki communautaire afin que d'autres personnes puissent essayer de le terminer! P>

Tout d'abord, vous souhaitez intercepter une structure de boîte à index entrée et le faire être interprété comme un symbole "unique". Le code suivant p> xxx pré>

fait une entrée x_i code> devenir un symbole nommé "$ indiquer $ x $ Split i" code> . Pas un nom de symbole unique garanti ... mais cela serait assez inhabituel! Remarques:
1) Que ce code ne récupérera pas les souscriptions écrites dans Fullform code>.
2) Cette définition ne tire que si les deux parties de l'indice sont "simples" - pas d'espaces, de crochets, d'opérateurs, etc ... p>

Suivant, car ce nom de symbole est si moche, voici une autre chose. Pour ce faire mieux quand il est demandé (cela devrait probablement être changé) p> xxx pré>

enfin, nous voulons que ce symbole de l'indice soit imprimé bien. Normalement, nous ferions cela à l'aide d'un Makeboxes Code> Définition - mais nous ne pouvons pas dans ce cas dans ce cas car symbole code> a l'attribut verrouillé code>: ( Au lieu de cela, nous allons pirater dans un $ pré-expression code> pour trouver ces symboles nommés follement nommés et les écrire sous forme de sous-domes: p> xxx pré>

enfin l'endroit où tout de cette chute est si vous essayez d'attribuer quelque chose à un symbole souscrit. Je n'ai pas essayé de travailler autour de cela! P>

Quelques tests - Notez que vous devrez convertir le code> Signaler code> S sur les cases réelles du code pour fonctionner. Faites cela en convertissant en standardform: Ctrl-Shift-n. P>

In[17]:= Subscript[x, z][z_]:=z^2
In[18]:= Subscript[x, z][2]
Out[18]= 4

In[19]:= ?Subscript[x, z]
Information::nomatch: No symbol matching Symbol["$sUbsCript$x$SPLIT$z"] found. >>


0 commentaires

2
votes

Voici un certain code que j'avais l'habitude d'utiliser pour faire cela. Cela devrait fonctionner pour vous aussi:

In[11]:= InputForm@DownValues[f]

Out[11]//InputForm=
{HoldPattern[f[ProxySymbol$99_]] :> Sin[ProxySymbol$99]}


1 commentaires

Salut Andrew - vient de voir ça. Cela fonctionne bien et est beaucoup plus sain d'esprit que mon approche. +1



0
votes

J'ai étudié le fil sur des variables souscrites en détail en collant les différentes réponses dans un ordinateur portable Mathematica (et l'avez essayé avec les Version 7 et 8). Cependant, ce que j'ai découvert, dans certains cas, la représentation explicite des variables souscrites comme indice indice [A, B] ne donne pas la bonne réponse comme contenue dans ces réponses. Cependant, lorsque j'ai utilisé explicitement la notation 2D pour l'indice (A_B), la réponse était comme prévu. Pourrait-il s'agir que lors du colle des symboles souscrit dans un email, ils sont représentés comme indice [A, B] . (Bien sûr, je devrais ajouter que pour chaque contribution, j'ai commencé Mathematica Fresh - après avoir utilisé Quit [] ).


1 commentaires

Bonjour Robert, bienvenue dans le débordement de la pile. Publier une nouvelle réponse n'est pas vraiment la place pour un tel commentaire, mais depuis que vous n'avez pas assez réputation de commenter , je suppose Il n'y a pas grand chose d'autre que vous pourriez faire pour augmenter ce point valide. Mathematica convertit automatiquement les boîtiers de l'indice en formulaire complet lors de la copie en tant que texte d'entrée, je pense que tout le monde a automatiquement converti le formulaire complet dans les cases lors du test et de la non-une pensée de mentionner ce fait. Je vais mettre à jour ma réponse pour refléter cette préoccupation.