Nous savons tous que Mathematica est excellent, mais il manque souvent de fonctionnalités essentielles. Quels types de packages / outils / ressources externes utilisez-vous avec Mathematica?
Je vais éditer (et inviter quiconque à le faire aussi) cet article principal pour inclure des ressources axées sur l'applicabilité générale dans la recherche scientifique et que le plus grand nombre de personnes possible trouveront utiles. N'hésitez pas à apporter quoi que ce soit, même de petits extraits de code (comme je l'ai fait ci-dessous pour une routine de chronométrage).
De plus, les fonctionnalités non documentées et utiles de Mathematica 7 et au-delà que vous avez trouvées vous-même ou que vous avez extraites d'un article / site sont les bienvenues.
Veuillez inclure une brève description ou un commentaire sur les raisons pour lesquelles quelque chose est génial ou l'utilité qu'il fournit. Si vous créez un lien vers des livres sur Amazon avec des liens d'affiliation, veuillez le mentionner, par exemple en mettant votre nom après le lien.
Paquets:
LevelScheme
est un progiciel qui élargit considérablement la capacité de Mathematica à produire des graphiques de qualité. Je l'utilise sinon pour autre chose, alors pour le contrôle beaucoup plus amélioré des ticks de trame / axes. Sa dernière version s'appelle SciDraw et sortira cette année.- David Park's
Presentation Package
(50 $ US - sans frais pour les mises à jour) - Le
grassmannOps
package de Jeremy Michelson fournit des ressources pour faire de l'algèbre et du calcul avec des variables de Grassmann et des opérateurs qui ont des relations de commutation non triviales. GrassmannAlgebra
Paquet et livre de John Brown pour travailler avec les algèbres de Grassmann et de Clifford.- RISC (Institut de recherche pour le calcul symbolique) a une variété de packages pour Mathematica (et d'autres langues) disponibles pour téléchargement. En particulier, il y a Theorema pour la démonstration automatisée de théorèmes, et la multitude de packages pour la sommation symbolique, les équations de différence, etc. sur la page des logiciels du groupe Algorithmic Combinatorics .
Outils:
MASH
est l'excellent Perl de Daniel Reeves script fournissant essentiellement un support de script pour Mathematica v7. (Maintenant intégré à partir de Mathematica 8 avec l'-script
option.)- Une
alternate Mathematica shell
avec une entrée readline GNU (en utilisant python, * nix uniquement) - Le package ColourMaths vous permet de sélectionner visuellement des parties d'une expression et de les manipuler. http://www.dbaileyconsultancy.co.uk/colour_maths/colour_maths.html
Ressources:
Le propre référentiel de Wolfram
MathSource
a beaucoup de blocs-notes utiles mais étroits pour diverses applications. Consultez également les autres sections telles queCurrent Documentation
,Courseware
pour les conférences,- et
Demos
pour, eh bien, les démos.
Le Wikibook Mathematica .
Livres:
- Programmation Mathematica: une introduction avancée par Leonid Shifrin (
web
,pdf
) est une lecture incontournable si vous voulez faire autre chose que des boucles For dans Mathematica. Nous avons le plaisir d'avoirLeonid
se voir répondre ici aux questions. - Méthodes quantiques avec Mathematica par James F.Feagin ( amazon )
- Le livre Mathematica de Stephen Wolfram ( Amazon ) (
web
) - Contour de Schaum ( amazone )
- Mathematica in Action par Stan Wagon ( amazon ) - 600 pages d'exemples soignés et remonte à Mathematica version 7. Les techniques de visualisation sont particulièrement bonnes, vous pouvez en voir certaines sur l'auteur
Demonstrations Page
. - Mathematica Programming Fundamentals par Richard Gaylord (
pdf
) - Une bonne introduction concise à la plupart de ce que vous devez savoir sur la programmation Mathematica. - Mathematica Cookbook de Sal Mangano publié par O'Reilly 2010 832 pages. - Écrit dans le style bien connu du livre de cuisine O'Reilly: Problème - Solution. Pour les intermédiaires.
- Equations différentielles avec Mathematica, 3e éd. Elsevier 2004 Amsterdam par Martha L. Abell, James P. Braselton - 893 pages Pour les débutants, apprenez à résoudre les DE et Mathematica en même temps.
Caractéristiques non documentées (ou à peine documentées):
- Comment personnaliser les raccourcis clavier de Mathematica. Voir
this question
. - Comment inspecter les modèles et les fonctions utilisés par les propres fonctions de Mathematica. Voir
this answer
- Comment obtenir une taille cohérente pour les graphiques graphiques dans Mathematica? Voir
this question
. - Comment produire des documents et des présentations avec Mathematica. Voir
this question
.
la source
Grid
, ou quoi que ce soit de ce genre.Réponses:
J'ai mentionné cela avant, mais l'outil que je trouve le plus utile est une application
Reap
etSow
qui imite / augment le comportement deGatherBy
:Cela me permet de regrouper les listes selon n'importe quel critère et de les transformer dans le processus. La façon dont cela fonctionne est qu'une fonction de critères (
f
) marque chaque élément de la liste, chaque élément est ensuite transformé par une deuxième fonction fournie (g
) et la sortie spécifique est contrôlée par une troisième fonction (h
). La fonctionh
accepte deux arguments: une balise et une liste des éléments collectés qui ont cette balise. Les articles conservent leur ordre d'origine, donc si vous définissez,h = #1&
vous obtenez un non triéUnion
, comme dans les exemples pourReap
. Mais, il peut être utilisé pour un traitement secondaire.À titre d'exemple de son utilité, j'ai travaillé avec Wannier90 qui génère l'hamiltonien spatialement dépendant dans un fichier où chaque ligne est un élément différent dans la matrice, comme suit
Pour transformer cette liste en un ensemble de matrices, j'ai rassemblé toutes les sous-listes contenant la même coordonnée, transformé les informations d'élément en une règle (c'est-à-dire {i, j} -> Re [Hij] + I Im [Hij]), et puis a transformé les règles collectées en un
SparseArray
tout avec une seule ligne:Honnêtement, c'est mon couteau suisse, et cela rend les choses complexes très simples. La plupart de mes autres outils sont quelque peu spécifiques à un domaine, donc je ne les publierai probablement pas. Cependant, la plupart d'entre eux, sinon tous, font référence
SelectEquivalents
.Edit : il n'imite pas complètement
GatherBy
en ce sens qu'il ne peut pas regrouper plusieurs niveaux de l'expression aussi simplement queGatherBy
possible. Cependant,Map
fonctionne très bien pour la plupart de ce dont j'ai besoin.Exemple : @Yaroslav Bulatov a demandé un exemple autonome. En voici une issue de mes recherches qui a été grandement simplifiée. Donc, disons que nous avons un ensemble de points dans un avion
et nous aimerions réduire le nombre de points par un ensemble d'opérations de symétrie. (Pour les curieux, nous générons le petit groupe de chaque point.) Pour cet exemple, utilisons un axe de rotation quadruple autour de l'axe z
En utilisant,
SelectEquivalents
nous pouvons regrouper les points qui produisent le même ensemble d'images sous ces opérations, c'est-à-dire qu'ils sont équivalents, en utilisant ce qui suitce qui produit 3 sous-listes contenant les points équivalents. (Remarque,
Union
c'est absolument vital ici car cela garantit que la même image est produite par chaque point. À l'origine, j'ai utiliséSort
, mais si un point se trouve sur un axe de symétrie, il est invariant sous la rotation autour de cet axe donnant une image supplémentaire de lui-même . Donc,Union
élimine ces images supplémentaires. Aussi,GatherBy
produirait le même résultat.) Dans ce cas, les points sont déjà sous une forme que j'utiliserai, mais je n'ai besoin que d'un point représentatif de chaque groupement et j'aimerais un décompte des points équivalents. Depuis, je n'ai pas besoin de transformer chaque point, j'utilise leIdentity
fonction en deuxième position. Pour la troisième fonction, nous devons être prudents. Le premier argument qui lui sera passé sera les images des points sous les rotations qui pour le point{0,0,0}
sont une liste de quatre éléments identiques, et l'utiliser annulerait le décompte. Cependant, le deuxième argument est juste une liste de tous les éléments qui ont cette balise, donc il ne contiendra que{0,0,0}
. Dans du code,Notez que cette dernière étape peut tout aussi facilement être accomplie en
Mais, il est facile avec cet exemple et l'exemple moins complet ci-dessus de voir comment des transformations très complexes sont possibles avec un minimum de code.
la source
Fortran
codes les mieux organisés et les mieux écrits que j'ai vu. Cela me fait presque envisager d'utiliserFortran
...L'un des avantages de l'interface du notebook Mathematica est qu'elle peut évaluer des expressions dans n'importe quel langage, pas seulement Mathematica. À titre d'exemple simple, envisagez de créer un nouveau type de cellule d'entrée Shell qui transmet l'expression contenue au shell du système d'exploitation pour évaluation.
Tout d'abord, définissez une fonction qui délègue l'évaluation d'une commande textuelle au shell externe:
Le deuxième argument est nécessaire et ignoré pour des raisons qui apparaîtront plus tard. Ensuite, nous voulons créer un nouveau style appelé Shell :
Shell
.Utilisez l'expression de cellule suivante comme texte de l' étape 6 :
La plupart de cette expression a été copiée directement à partir du style Program intégré . Les principaux changements sont ces lignes:
Evaluatable
active la fonctionnalité SHIFT + ENTER pour la cellule. L'évaluation appellera leCellEvaluationFunction
passage du contenu de la cellule et du type de contenu comme arguments (shellEvaluate
ignore ce dernier argument).CellFrameLabels
est juste une subtilité qui permet à l'utilisateur d'identifier que cette cellule est inhabituelle.Avec tout cela en place, nous pouvons maintenant entrer et évaluer une expression shell:
Il est préférable de conserver ce style défini dans une feuille de style située au centre. De plus, les fonctions d'évaluation telles que
shellEvaluate
sont mieux définies comme des stubs à l' aide de DeclarePackage dansinit.m
. Les détails de ces deux activités dépassent le cadre de cette réponse.Avec cette fonctionnalité, on peut créer des cahiers qui contiennent des expressions d'entrée dans n'importe quelle syntaxe d'intérêt. La fonction d'évaluation peut être écrite en pure Mathematica, ou déléguer tout ou partie de l'évaluation à une agence externe. Sachez qu'il existe d'autres crochets qui se rapportent à l' évaluation cellulaire, comme
CellEpilog
,CellProlog
etCellDynamicExpression
.Un modèle courant consiste à écrire le texte de l'expression d'entrée dans un fichier temporaire, à compiler le fichier dans une langue, à exécuter le programme et à capturer la sortie pour un affichage final dans la cellule de sortie. Il y a beaucoup de détails à aborder lors de la mise en œuvre d'une solution complète de ce type (comme la capture correcte des messages d'erreur), mais il faut apprécier le fait qu'il est non seulement possible de faire des choses comme celle-ci, mais aussi pratique.
Sur une note personnelle, ce sont des fonctionnalités comme celle-ci qui font de l'interface du notebook le centre de mon univers de programmation.
Mettre à jour
La fonction d'assistance suivante est utile pour créer de telles cellules:
Il est utilisé ainsi:
Désormais, si
shellCell[]
est évalué, la cellule d'entrée sera supprimée et remplacée par une nouvelle cellule d'entrée qui évalue son contenu comme une commande shell.la source
CellEvaluationFunction
pourrait être utilisé pour le piratage de syntaxe de bas niveau aussi je pense.CellEvaluationFunction
le crochet que vous recherchiez?Cell
option liée à l'évaluation des cellules -Evaluator -> "EvaluatorName"
. La signification de"EvaluatorName"
peut être configurée via la boîte de dialogue Evaluation :: Kernel Configuration Options .... Je ne sais toujours pas s'il est possible de le configurer par programmation ... Cette technique permet d'utiliser différents MathKernels dans différentsCell
s dans un seul Notebook. Ces MathKernels peuvent provenir de différentes versions de Mathematica installées.Import
, ou peut-être en démarrant un processus Python externe et en communiquant via ses flux (par exemple en utilisant un Java ProcessBuilder ). Je suis sûr qu'il y a une meilleure façon de Mathematica - cela ressemble à une bonne question SO :)Todd Gayley (Wolfram Research) vient de m'envoyer un joli hack qui permet de "envelopper" les fonctions intégrées avec du code arbitraire. Je sens que je dois partager cet instrument utile. Ce qui suit est la réponse de Todd sur mon
question
.la source
Unprotect
doit en effet être, a été simplement laissé de côté. Le but deBlock
(portée dynamique) et$inMsg
est exactement d'empêcher une récursion infinie. Parce que$inMsg
n'est pas défini à l'extérieur (c'est une exigence importante), dans un premier temps,TrueQ
évalue àFalse
, et nous entrons dans le corps de la fonction. Mais lorsque nous avons l'appel de fonction à l'intérieur du corps, la condition est évaluée àFalse
(puisque la variable a été redéfinie par Block). Ainsi, la règle définie par l'utilisateur ne correspond pas et la règle intégrée est utilisée à la place.DownValues
au moment de l'exécution, vous pouvez consulter ce post groups.google.com/group/comp.soft-sys.math.mathematica/… , pour un exemple (SetDelayed
redéfinition) . Mais ma méthode est moins élégante, moins robuste, plus sujette aux erreurs et rend la rupture de la récursivité beaucoup moins simple à mettre en œuvre. Ainsi, dans la plupart des situations, la méthode décrite par @Alexey l'emporte haut la main.Ce n'est pas une ressource complète, donc je la jette ici dans la section des réponses, mais je l'ai trouvée très utile pour déterminer les problèmes de vitesse (ce qui, malheureusement, est une grande partie de la programmation Mathematica).
L'utilisation est alors simple
timeAvg@funcYouWantToTest
.EDIT: M. Wizard a fourni une version plus simple qui supprime
Throw
etCatch
et est un peu plus facile à analyser:EDIT: Voici une version de acl (tirée d' ici ):
la source
Catch
etThrow
auraient dû être utilisés avec des balises d'exception uniques.Throw
etCatch
" plutôt que "Reap
etSow
".RepeatedTiming
à faire.Internal`InheritedBlock
J'ai appris récemment l'existence d'une fonction aussi utile que
Internal`InheritedBlock
, de ce message de Daniel Lichtblau dans le newsgroup officiel.Si je comprends bien,
Internal`InheritedBlock
permet de transmettre une copie d'une fonction sortante à l'intérieur de laBlock
portée:Je pense que cette fonction peut être très utile pour tous ceux qui ont besoin de modifier temporairement les fonctions intégrées!
Comparaison avec Block
Définissons une fonction:
Nous souhaitons maintenant passer une copie de cette fonction dans la
Block
portée. Le procès naïf ne donne pas ce que l'on veut:Maintenant, essayez d'utiliser la définition retardée dans le premier argument de
Block
(c'est aussi une fonctionnalité non documentée):Nous voyons que dans ce cas
a
fonctionne mais nous n'avons pas de copie de l'original à l'a
intérieur duBlock
portée.Essayons maintenant
Internal`InheritedBlock
:Nous avons une copie de la définition originale pour l'
a
intérieur de laBlock
portée et nous pouvons la modifier comme nous le souhaitons sans affecter la définition globale dea
!la source
Mathematica est un outil pointu, mais il peut vous couper avec son comportement quelque peu non typé et ses avalanches de messages de diagnostic cryptiques . Une façon de gérer cela est de définir des fonctions en suivant cet idiome:
C'est beaucoup de passe-partout, que je suis souvent tenté de sauter. Surtout lors du prototypage, ce qui arrive souvent dans Mathematica. Du coup, j'utilise une macro appelée
define
qui me permet de rester disciplinée, avec beaucoup moins de passe-partout.Une utilisation basique de
define
est comme ceci:Cela ne semble pas grand-chose au début, mais il y a des avantages cachés. Le premier service qui
define
fournit est qu'il s'applique automatiquementClearAll
au symbole en cours de définition. Cela garantit qu'il n'y a pas de définitions restantes - une occurrence courante lors du développement initial d'une fonction.Le deuxième service est que la fonction en cours de définition est automatiquement "fermée". Je veux dire par là que la fonction émettra un message et abandonnera si elle est invoquée avec une liste d'arguments qui ne correspond pas à l'une des définitions:
Il s'agit de la valeur principale de
define
, qui détecte une classe d'erreur très courante.Une autre commodité est une manière concise de spécifier les attributs de la fonction en cours de définition. Faisons la fonction
Listable
:En plus de tous les attributs normaux,
define
accepte un attribut supplémentaire appeléOpen
. Cela empêchedefine
d'ajouter la définition d'erreur fourre-tout à la fonction:Plusieurs attributs peuvent être définis pour une fonction:
Sans plus tarder, voici la définition de
define
:L'implémentation présentée ne prend en charge ni les valeurs haussières, ni le currying, ni les modèles plus généraux qu'une simple définition de fonction. Cela reste cependant utile.
la source
Commencez sans ouvrir un cahier vierge
Cela me dérangeait de faire démarrer Mathematica avec un cahier vierge ouvert. Je pourrais fermer ce cahier avec un script, mais il s'ouvrirait encore brièvement. Mon hack est de créer un fichier
Invisible.nb
contenant:Et ajoutez ceci à mon
Kernel\init.m
:Je lance maintenant Mathematica en ouvrant
Invisible.nb
Il y a peut-être un meilleur moyen, mais cela m'a bien servi.
Personnalisé
Fold
etFoldList
Fold[f, x]
est rendu équivalent àFold[f, First@x, Rest@x]
Soit dit en passant, je pense que cela pourrait se retrouver dans une future version de Mathematica.Surprise! Cela a été mis en œuvre, bien qu'il ne soit actuellement pas documenté. On m'informe qu'il a été mis en œuvre en 2011 par Oliver Ruebenkoenig, apparemment peu de temps après avoir publié ceci. Merci Oliver Ruebenkoenig!
Mis à jour pour permettre ceci:
"Partition dynamique"
Voir Mathematica.SE post # 7512 pour une nouvelle version de cette fonction.
Souvent, je souhaite partitionner une liste selon une séquence de longueurs.
exemple de pseudo-code:
partition[{1,2,3,4,5,6}, {2,3,1}]
Production:
{{1,2}, {3,4,5}, {6}}
Je suis venu avec ceci:
Ce que j'ai ensuite complété avec ceci, y compris les tests d'argument:
Le troisième argument contrôle ce qui arrive aux éléments au-delà de la spécification fractionnée.
Astuces Mathematica de Szabolcs
Celui que j'utilise le plus fréquemment est la palette de données tabulaires Coller
Modifier les données externes de l'intérieur
Compile
Récemment, Daniel Lichtblau a montré cette méthode que je n'avais jamais vue auparavant. À mon avis, cela étend considérablement l'utilité de
Compile
la source
Compile
- tout mon message ici: stackoverflow.com/questions/5246330/… , était de présenter cette possibilité dans un cadre non trivial (il y avait déjà une solution plus courte et plus rapide au problème en question) . IMO, la plus grande victoire ici est la possibilité d'émuler le passage par référence et de diviser les grandes fonctions compilées en morceaux plus faciles à gérer et réutilisables.Problèmes et solutions d'exportation PDF / EMF généraux
1) C'est complètement inattendu et non documenté, mais Mathematica exporte et enregistre les graphiques aux formats PDF et EPS à l'aide d'un ensemble de définitions de style différent de celui utilisé pour afficher les blocs-notes à l'écran. Par défaut, les blocs-notes sont affichés à l'écran dans l'environnement de style "Travail" (qui est la valeur par défaut pour l' option
ScreenStyleEvironment
globale$FrontEnd
) mais sont imprimés dans l'"Printout"
environnement de style (qui est la valeur par défaut pour l' optionPrintingStyleEnvironment
globale$FrontEnd
). Quand on exporte des graphiques dans des formats raster tels que GIF et PNG ou au format EMF, Mathematica génère des graphiques qui ressemblent exactement à ce qu'ils ressemblent à l'intérieur de Notebook. Il semble que le"Working"
l'environnement de style est utilisé pour le rendu dans ce cas. Mais ce n'est pas le cas lorsque vous exportez / enregistrez quoi que ce soit au format PDF ou EPS! Dans ce cas, l'"Printout"
environnement de style est utilisé par défautqui diffère très profondément de l'environnement de style "Travail". Tout d'abord, l'"Printout"
environnement de style est fixéMagnification
à 80% . Deuxièmement, il utilise ses propres valeurs pour les tailles de police de styles différents, ce qui entraîne des changements de taille de police incohérents dans le fichier PDF généré par rapport à la représentation originale à l'écran. Ces dernières peuvent être appelées des fluctuations de FontSize qui sont très ennuyeuses. Mais heureusement, cela peut être évité en définissant l' optionPrintingStyleEnvironment
globale$FrontEnd
sur "Working" :2) Le problème commun avec l'exportation au format EMF est que la plupart des programmes (pas seulement Mathematica ) génèrent un fichier qui a l'air bien à la taille par défaut mais qui devient moche lorsque vous le zoomez. C'est parce que les métafichiers sont échantillonnés avec la fidélité de résolution d'écran . La qualité du fichier EMF généré peut être améliorée en
Magnify
utilisant l'objet graphique d'origine de sorte que l'exactitude de l'échantillonnage des graphiques d'origine devienne beaucoup plus précise. Comparez deux fichiers:Si vous insérez ces fichiers dans Microsoft Word et les zoomez, vous verrez que le premier "a" a une dent de scie dessus alors que le second n'en a pas (testé avec Mathematica 6).
Une autre solution a
ImageResolution
été suggérée par Chris Degnen (cette option a au moins effet à partir de Mathematica 8):3) Dans Mathematica, nous avons trois façons de convertir des graphiques en métafichier: via
Export
to"EMF"
(méthode fortement recommandée: produit un métafichier avec la plus haute qualité possible), via l'Save selection As...
élément de menu ( produit un chiffre beaucoup moins précis , non recommandé) et via l'Edit ► Copy As ► Metafile
élément de menu ( je recommande fortement contre cette route ).la source
À la demande générale, le code pour générer le tracé des 10 premiers répondeurs SO (à l'exception des annotations ) à l'aide de l' API SO .
la source
Mettre en cache des expressions
Je trouve ces fonctions très utiles pour mettre en cache toute expression. La chose intéressante ici pour ces deux fonctions est que l'expression maintenue elle-même est utilisée comme clé de la table de hachage / symbole Cache ou CacheIndex, par rapport à la mémorisation bien connue de Mathematica où vous ne pouvez mettre en cache le résultat que si la fonction est définie comme f [x_]: = f [x] = ... Ainsi, vous pouvez mettre en cache n'importe quelle partie d'un code, c'est utile si une fonction doit être appelée plusieurs fois mais que certaines parties du code ne doivent pas être recalculées.
Pour mettre en cache une expression indépendamment de ses arguments.
La deuxième fois, l'expression renvoie 6 sans attendre.
Pour mettre en cache une expression à l'aide d'une expression d'alias qui peut dépendre d'un argument de l'expression mise en cache.
Si expr prend un certain temps à calculer, il est beaucoup plus rapide d'évaluer {"f", 2} par exemple pour récupérer le résultat mis en cache.
Pour une variation de ces fonctions afin d'avoir un cache localisé (c'est-à-dire que la mémoire cache est automatiquement libérée en dehors de la construction Block), voir ce post Eviter les appels répétés à l'interpolation
Suppression des valeurs mises en cache
Pour supprimer les valeurs mises en cache lorsque vous ne connaissez pas le nombre de définitions d'une fonction. Je considère que les définitions ont un blanc quelque part dans leurs arguments.
Pour supprimer les valeurs mises en cache lorsque vous connaissez le nombre de définitions d'une fonction (va légèrement plus vite).
Cela utilise le fait que les définitions d'une fonction sont à la fin de leur liste DownValues, les valeurs mises en cache avant.
Utilisation de symboles pour stocker des données et des fonctions de type objet
Voici également des fonctions intéressantes pour utiliser des symboles comme des objets.
Il est déjà bien connu que vous pouvez stocker des données dans des symboles et y accéder rapidement en utilisant DownValues
Vous pouvez accéder à la liste des clés (ou propriétés) d'un symbole en utilisant ces fonctions en fonction de ce que les dreeves ont soumis dans un message sur ce site:
J'utilise beaucoup cette fonction pour afficher toutes les infos contenues dans les DownValues d'un symbole:
Enfin, voici un moyen simple de créer un symbole qui se comporte comme un objet en programmation orientée objet (il reproduit simplement le comportement le plus basique de la POO mais je trouve la syntaxe élégante):
Les propriétés sont stockées en tant que DownValues et les méthodes en tant que Upvalues retardées dans le symbole créé par Module qui est renvoyé. J'ai trouvé la syntaxe de function2 qui est la syntaxe OO habituelle pour les fonctions de la structure de données arborescente dans Mathematica .
Pour une liste des types de valeurs existants de chaque symbole, voir http://reference.wolfram.com/mathematica/tutorial/PatternsAndTransformationRules.html et http://www.verbeia.com/mathematica/tips/HTMLLinks/Tricks_Misc_4.html .
Par exemple, essayez ceci
Vous pouvez aller plus loin si vous souhaitez émuler l'héritage d'objets à l'aide d'un package appelé InheritRules disponible ici http://library.wolfram.com/infocenter/MathSource/671/
Vous pouvez également stocker la définition de la fonction non pas dans newObject mais dans un symbole de type, donc si NewObject a renvoyé le type [newObject] au lieu de newObject, vous pouvez définir la fonction et la fonction2 comme ceci en dehors de NewObject (et pas à l'intérieur) et avoir la même utilisation qu'avant .
Utilisez UpValues [type] pour voir que la fonction et la fonction2 sont définies dans le symbole de type.
D'autres idées sur cette dernière syntaxe sont présentées ici https://mathematica.stackexchange.com/a/999/66 .
Version améliorée de SelectEquivalents
@rcollyer: Merci beaucoup d'avoir apporté SelectEquivalents à la surface, c'est une fonction incroyable. Voici une version améliorée de SelectEquivalents listée ci-dessus avec plus de possibilités et utilisant des options, cela le rend plus facile à utiliser.
Voici des exemples d'utilisation de cette version:
Utiliser correctement Mathematica Gather / Collect
Comment feriez-vous une fonction de tableau croisé dynamique dans Mathematica?
Algorithme de binning 2D rapide Mathematica
Interne`Sac
Daniel Lichtblau décrit ici une structure de données interne intéressante pour la croissance des listes.
Implémentation d'un Quadtree dans Mathematica
Fonctions de débogage
Ces deux articles pointent vers des fonctions utiles pour le débogage:
Comment déboguer lors de l'écriture de petits ou gros codes avec Mathematica? Table de travail? débogueur mma? ou autre chose? (Montre le)
/programming/5459735/the-clearest-way-to-represent-mathematicas-evaluation-sequence/5527117#5527117 (TraceView)
Voici une autre fonction basée sur Reap et Sow pour extraire des expressions de différentes parties d'un programme et les stocker dans un symbole.
Voici un exemple
Autres ressources
Voici une liste de liens intéressants à des fins d'apprentissage:
Une collection de ressources d'apprentissage Mathematica
Mis à jour ici: https://mathematica.stackexchange.com/a/259/66
la source
f[x_] := f[x] = some code
mémorisation standard .c:Cache[expr_] := c = expr
.SelectEquivalents
. Je pense que je resteraisTagOnElement
le deuxième paramètre par défaut,Identity
car c'est le plus utilisé d'entre eux. Je ne pense pas avoir inclusFinalOp
non plus, car cela peut être traité à l'intérieurOpOnTaggedElems
. Je raccourcirais également les noms des options, car leur longueur rend la saisie difficile. EssayezTagFunction
,TransformElement
,TransformResults
et à laTagPattern
place. Les deux,TagPattern
etMapLevel
sont d'excellents ajouts à la fonctionnalité, et une bonne réécriture, dans l'ensemble.Mes fonctions utilitaires (je les ai intégrées à MASH, ce qui est mentionné dans la question):
la source
Une astuce que j'ai utilisée, qui vous permet d'émuler la façon dont la plupart des fonctions intégrées fonctionnent avec de mauvais arguments (en envoyant un message puis en renvoyant le formulaire entier non évalué) exploite une bizarrerie de la façon dont
Condition
fonctionne lorsqu'il est utilisé dans une définition. Si celafoo
ne devrait fonctionner qu'avec un seul argument:Si vous avez des besoins plus complexes, il est facile de considérer la validation des arguments et la génération de messages comme une fonction indépendante. Vous pouvez faire des choses plus élaborées en utilisant des effets secondaires
Condition
delà de la simple génération de messages, mais à mon avis, la plupart d'entre eux tombent dans la catégorie "bidouillage" et devraient être évités si possible.De plus, dans la catégorie "métaprogrammation", si vous avez un
.m
fichier package Mathematica ( ), vous pouvez utiliser l'"HeldExpressions"
élément pour récupérer toutes les expressions du fichier encapsuléesHoldComplete
. Cela rend le suivi des choses beaucoup plus facile que d'utiliser des recherches textuelles. Malheureusement, il n'y a pas de moyen facile de faire la même chose avec un bloc-notes, mais vous pouvez obtenir toutes les expressions d'entrée en utilisant quelque chose comme ce qui suit:Enfin, vous pouvez utiliser le fait qui
Module
émule les fermetures lexicales pour créer l'équivalent des types référence. Voici une pile simple (qui utilise une variante de l'Condition
astuce pour la gestion des erreurs en prime):Vous pouvez désormais imprimer les éléments d'une liste dans l'ordre inverse d'une manière inutilement compliquée!
la source
HeldExpressions
élément dans les packages, n'en était pas conscient. J'importais généralement sous forme de chaîne, puis j'utilisaisToExpression
avecHoldComplete
comme dernier argument. En ce qui concerne l'utilisationCondition
des messages - c'est une technique standard dans l'écriture de paquets depuis au moins 1994. Concernant la persistance viaModule
vars - j'ai eu un long article à ce sujet sur Mathgroup il y a quelque temps: groups.google.com/group/comp.soft- sys.math.mathematica /… (mon troisième article dans ce fil de discussion), cela va dans le même sens et contient des liens vers quelques exemples d'utilisation non triviaux.Condition
truc comme un savoir, probablement d'un collègue, mais je ne savais pas que c'était une technique standard. Le lien sur l'utilisation desModule
symboles comme types de référence est intéressant!Impression des définitions de symboles du système sans contexte ajouté
La
contextFreeDefinition[]
fonction ci-dessous tentera d'imprimer la définition d'un symbole sans le contexte le plus courant ajouté. La définition peut ensuite être copiée dans Workbench et formatée pour la lisibilité (sélectionnez-la, clic droit, Source -> Format)withRules []
Avertissement: cette fonction ne localise pas les variables de la même manière
With
etModule
ne le fait pas, ce qui signifie que les constructions de localisation imbriquées ne fonctionneront pas comme prévu.withRules[{a -> 1, b -> 2}, With[{a=3}, b_ :> b]]
va remplacera
etb
dans le imbriquéeWith
etRule
, alors queWith
en ne le fait pas.Ceci est une variante de
With
qui utilise des règles au lieu de=
et:=
:J'ai trouvé cela utile lors du nettoyage du code écrit pendant l'expérimentation et la localisation des variables. Parfois, je me retrouve avec des listes de paramètres sous la forme de
{par1 -> 1.1, par2 -> 2.2}
. LeswithRules
valeurs de paramètre sont faciles à injecter dans le code précédemment écrit à l'aide de variables globales.L'utilisation est juste comme
With
:Graphiques 3D anti-crénelage
Il s'agit d'une technique très simple pour antialiaser les graphiques 3D même si votre matériel graphique ne le prend pas en charge de manière native.
Voici un exemple:
Notez qu'une valeur élevée
n
ou une taille d'image élevée a tendance à exposer des bogues de pilotes graphiques ou à introduire des artefacts.Fonctionnalité de diff du notebook
La fonctionnalité Notebook diff est disponible dans le
<<AuthorTools`
package et (au moins dans la version 8) dans leNotebookTools`
contexte non documenté . C'est une petite interface graphique pour différencier deux notebooks actuellement ouverts:la source
a = 3; b = 4;
avant votre exemple d'appel, puis en appelantwithRules
. Vous pouvez l' enregistrer en utilisant plutôt ce qui suit:SetAttributes[withRules, HoldAll];withRules[rules_, expr_] := Unevaluated[expr] /. Unevaluated[rules]
. Les différences de sémantique d'With
alors: 1. les côtés des règles ne sont pas évalués maintenant 2.withRules
ne résout pas les conflits de dénomination avec les constructions de portée interne comme leWith
fait. Le dernier est assez sérieux - être une bonne ou une mauvaise chose selon les cas.With
s imbriqués . Cela ne fonctionne pas toujours non plus avec les constructions de localisation intégrées, par exempleWith[{a=1}, Block[{a=2}, a]]
. Pensez-vous qu'il y ait une bonne raison pour laquelle l'imbricationBlock
ne se localise pas là, comme imbriquéWith
et leModule
fait?)Unevaluated[rules]
parce que je voulaisx -> 1+1
évaluer le RHS.With
s imbriqués sont faciles à repérer et à éviter, mais les modèles ne le sont pas:With[{a = 1}, a_ -> a]
localise l'intérieura
alors que cewithRules
n'est pas le cas. Savez-vous s'il existe un moyen d'accéder au mécanisme de localisation interne de Mathematica et de créer de nouvelles constructions (similaires àRule
) qui localisent également? Je supprimerai probablement cette réponse plus tard car elle est plus dangereuse qu'utile, mais j'aimerais d'abord jouer un peu plus avec elle.InheritedBlock
est plutôt cool et résout le problème de manière très élégante. En ce qui concerne les conflits de portée, normalement les liaisons pour la portée lexicale se produisent au "moment de la liaison lexicale", c'est-à-dire avant l'exécution, tandis que la portée dynamique se lie au moment de l'exécution, ce qui pourrait l'expliquer. Vous pouvez comparer cela avec le cas similaire pourModule
, qui permet une utilisation constructive (voir par exemple ici stackoverflow.com/questions/7394113/… ). Le problème est qu'ilBlock
faut un symbole pour ...Les fonctions pures récursives (
#0
) semblent être l'un des coins les plus sombres du langage. Voici quelques exemples non triviaux de leur utilisation, où cela est vraiment utile (non pas qu'ils ne peuvent pas se passer de cela). Ce qui suit est une fonction assez concise et raisonnablement rapide pour trouver des composants connectés dans un graphe, étant donné une liste d'arêtes spécifiées sous forme de paires de sommets:Ce qui se passe ici, c'est que nous mappons d'abord un symbole factice sur chacun des nombres de sommets, puis mettons en place une manière qui, étant donné une paire de sommets
{f[5],f[10]}
, par exemple,f[5]
serait alors évaluéef[10]
. La fonction pure récursive est utilisée comme compresseur de chemin (pour configurer la mémorisation de telle sorte qu'au lieu de longues chaînes commef[1]=f[3],f[3]=f[4],f[4]=f[2], ...
, les valeurs mémorisées soient corrigées chaque fois qu'une nouvelle "racine" du composant est découverte. Cela donne une accélération significative. Parce que nous utilisons l'affectation, nous avons besoin qu'elle soit HoldAll, ce qui rend cette construction encore plus obscure et plus attrayante). Cette fonction est le résultat d'une discussion en ligne et hors ligne de Mathgroup impliquant Fred Simons, Szabolcs Horvat, DrMajorBob et le vôtre. Exemple:Il est certes beaucoup plus lent qu'un intégré, mais pour la taille du code, assez rapide quand même IMO.
Autre exemple: voici une réalisation récursive de
Select
, basée sur des listes chaînées et des fonctions pures récursives:Par exemple,
Il n'est cependant pas correctement récursif de queue, et fera exploser la pile (plantera le noyau) pour des listes plus grandes. Voici la version récursive de la queue:
Par exemple,
la source
Ceci est la recette du livre de Stan Wagon ... utilisez-la lorsque le Plot intégré se comporte de manière erratique en raison d'un manque de précision
J'utilise souvent l'astuce suivante de Kristjan Kannike lorsque j'ai besoin d'un comportement "de type dictionnaire" à partir des valeurs descendantes de Mathematica
Lorsque les résultats de l'évaluation sont confus, il est parfois utile de vider les étapes d'évaluation dans un fichier texte
la source
Il est possible d'exécuter MathKernel en mode batch en utilisant des options de ligne de commande
-batchinput
-batchoutput
non documentées et :(où
input.m
est le fichier d'entrée par lots se terminant par le caractère de nouvelle ligne,outputfile.txt
est le fichier vers lequel la sortie sera redirigée).Dans Mathematica v.> = 6, MathKernel a une option de ligne de commande non documentée:
qui contrôle si MathKernel aura une icône visible sur la barre des tâches (au moins sous Windows).
Le FrontEnd (au moins à partir de la version 5) a une option de ligne de commande non documentée
qui désactive l'écran de démarrage et permet d'exécuter le Mathematica FrontEnd beaucoup plus rapidement
et option
qui désactive le mécanisme qui lance la version la plus récente de Mathematica installée au lieu de lancer la version associée aux fichiers .nb dans le registre système.
Une autre façon de le faire est probablement :
Il est pratique de combiner la dernière option de ligne de commande avec la définition de l'option FrontEnd globale
VersionedPreferences->True
qui désactive le partage des préférences entre les différentes versions de Mathematica installées :(Ce qui précède doit être évalué dans la version la plus récente de Mathematica installée.)
Dans Mathematica 8, cela est contrôlé dans la boîte de dialogue Préférences, dans le volet Système, sous le paramètre "Créer et maintenir des préférences frontales spécifiques à la version" .
Il est possible d'obtenir une liste incomplète des options de ligne de commande du FrontEnd en utilisant une clé non documentée
-h
(le code pour Windows):donne:
D'autres options incluent:
Existe-t-il d'autres options de ligne de commande potentiellement utiles de MathKernel et de FrontEnd? Veuillez partager si vous savez.
Question connexe .
la source
-32
et signifie que le bitness du MathKernel utilisé par le FrontEnd correspondra au bitness du système d'exploitation (64 bits). Il semble que dans d'autres cas, cette option ne changera rien.Mes hacks préférés sont de petites macros générant du code qui vous permettent de remplacer un tas de commandes standard standard par une courte. Vous pouvez également créer des commandes pour ouvrir / créer des blocs-notes.
Voici ce que j'utilise depuis un certain temps dans mon flux de travail Mathematica quotidien. Je me suis retrouvé à jouer beaucoup ce qui suit:
Faire tout cela à la main encore et encore est une douleur, alors automatisons! Tout d'abord, un code utilitaire:
Maintenant, créons une macro qui va mettre les cellules suivantes dans le cahier:
Et voici la macro:
Maintenant, lorsque je tape,
MyPrivatize[]
c'est crée le contexte privé et charge mon package standard. Créons maintenant une commande qui ouvrira un nouveau bloc-notes avec son propre contexte privé (pour que vous puissiez y pirater avec un abandon sauvage sans risquer de bousiller les définitions), mais qui a accès à vos contextes actuels.La chose intéressante à ce sujet est que
SelfDestruct
, lorsque la commande s'exécute, elle ne laisse aucune trace dans le cahier actuel - ce qui est bien, car sinon, cela créerait simplement du désordre.Pour des points de style supplémentaires, vous pouvez créer des déclencheurs de mots clés pour ces macros en utilisant
InputAutoReplacements
, mais je laisserai cela comme un exercice pour le lecteur.la source
PutAppend avec PageWidth -> Infinity
Dans Mathematica, l' utilisation de la
PutAppend
commande est le moyen le plus simple de maintenir un fichier journal en cours d'exécution avec les résultats des calculs intermédiaires. Mais il utilise par défaut lePageWith->78
paramètre lors de l'exportation d'expressions vers un fichier et il n'y a donc aucune garantie que chaque sortie intermédiaire ne prendra qu'une seule ligne dans le journal.PutAppend
n'a pas d'options en lui-même mais le suivi de ses évaluations révèle qu'il est basé sur laOpenAppend
fonction qui a l'PageWith
option et permet de changer sa valeur par défaut par laSetOptions
commande:Nous pouvons
PutAppend
donc ajouter une seule ligne à la fois en définissant:METTRE À JOUR
Il y a un bug introduit dans la version 10 (corrigé dans la version 11.3):
SetOptions
n'affecte plus le comportement deOpenWrite
etOpenAppend
.Une solution de contournement consiste à implémenter votre propre version de
PutAppend
avec l'PageWidth -> Infinity
option explicite :Notez que nous pouvons également l'implémenter via
WriteString
comme indiqué dans cette réponse, mais dans ce cas, il sera nécessaire de convertir au préalable l'expression enInputForm
via correspondantToString[expr, InputForm]
.la source
Je regardais à travers l' un de mes paquets pour l' inclusion dans ce domaine , et a trouvé quelques messages que je définis qui font des merveilles:
Debug::<some name>
. Par défaut, ils sont désactivés, donc ne produisent pas beaucoup de frais généraux. Mais, je peux jeter mon code avec eux, et les activer si j'ai besoin de comprendre exactement comment un peu de code se comporte.la source
Debug
niTrace
; c'est un ensemble de messages que j'ai créés avec lesquels je peux jeter mon code pour activer / désactiver à volonté. Ils sont précédés du motDebug
, de la même manière qu'unusage
msg est précédé du nom de la fonction. Il fournit la même fonctionnalité que de placer un tas d'cout
instructions dans du code C ++.L'une des choses qui me dérange à propos des constructions de portée intégrées est qu'elles évaluent toutes les définitions de variables locales à la fois, vous ne pouvez donc pas écrire par exemple
Donc, il y a quelque temps, j'ai proposé une macro appelée WithNest qui vous permet de le faire. Je trouve cela pratique, car il vous permet de garder les liaisons de variables locales sans avoir à faire quelque chose comme
En fin de compte, le meilleur moyen que j'ai pu trouver pour le faire était d'utiliser un symbole spécial pour faciliter la répétition de la liste des liaisons, et j'ai mis la définition dans son propre package pour garder ce symbole caché. Peut-être que quelqu'un a une solution plus simple à ce problème?
Si vous voulez l'essayer, placez ce qui suit dans un fichier appelé
Scoping.m
:la source
Celui-ci a été écrit par Alberto Di Lullo, (qui ne semble pas être sur Stack Overflow).
CopyToClipboard
, pour Mathematica 7 (dans Mathematica 8, il est intégré)Message original: http://forums.wolfram.com/mathgroup/archive/2010/Jun/msg00148.html
J'ai trouvé cette routine utile pour copier de grands nombres réels dans le presse-papiers sous forme décimale ordinaire. Par exemple
CopyToClipboard["123456789.12345"]
Cell[OutputFormData@expr]
supprime proprement les guillemets.la source
Ce code crée une palette qui télécharge la sélection dans Stack Exchange en tant qu'image. Sous Windows, un bouton supplémentaire est fourni qui donne un rendu plus fidèle de la sélection.
Copiez le code dans une cellule de cahier et évaluez. Ensuite, sortez la palette de la sortie et installez-la en utilisant
Palettes -> Install Palette...
Si vous rencontrez des problèmes, postez un commentaire ici. Téléchargez la version notebook ici .
la source
Je suis sûr que beaucoup de gens ont rencontré la situation où ils exécutent certaines choses, réalisant que non seulement cela a bloqué le programme, mais qu'ils n'ont pas non plus sauvegardé pendant les 10 dernières minutes!
ÉDITER
Après avoir souffert de cela pendant un certain temps, j'ai découvert un jour que l' on pouvait créer une sauvegarde automatique à partir du code Mathematica . Je pense que l'utilisation d'une telle sauvegarde automatique m'a beaucoup aidé dans le passé, et j'ai toujours pensé que la possibilité elle-même était quelque chose que peu de gens savent qu'ils peuvent faire.
Le code original que j'ai utilisé est en bas. Grâce aux commentaires, j'ai découvert que c'était problématique, et qu'il est préférable de le faire d'une manière alternative, en utilisant
ScheduledTask
(qui ne fonctionnera que dans Mathematica 8).Le code pour cela peut être trouvé dans cette réponse de
Sjoerd C. de Vries
(Puisque je ne suis pas sûr de pouvoir le copier ici, je le laisse sous forme de lien uniquement.)La solution ci-dessous utilise
Dynamic
. Il sauvegardera le notebook toutes les 60 secondes, mais apparemment seulement si sa cellule est visible . Je le laisse ici uniquement pour des raisons d'achèvement. (et pour les utilisateurs de Mathematica 6 et 7)/ÉDITER
Pour le résoudre, j'utilise ce code au début d'un cahier:
Cela enregistrera votre travail toutes les 60 secondes.
Je le préfère
NotebookAutoSave[]
car il enregistre avant que l'entrée ne soit traitée, et parce que certains fichiers sont plus du texte que des entrées.Je l'ai trouvé à l'origine ici: http://en.wikipedia.org/wiki/Talk:Mathematica#Criticisms
Notez qu'une fois cette ligne exécutée, l'enregistrement se fera même si vous fermez et rouvrez votre fichier (tant que la mise à jour dynamique est activée).
Aussi, comme il n'y a pas d'annulation dans Mathematica , veillez à ne pas supprimer tout votre contenu, car l'enregistrement le rendra irréversible (par mesure de précaution, je supprime ce code de chaque cahier terminé)
la source
NotebookSave[SelectedNotebook[], "work-" <> IntegerString[i] <> ".nb"]; i++
, mais je pense que tout type de référence au nom actuel du bloc-notes deviendra récursif.Dynamic
objets ne sont rafraîchis que lorsqu'ils sont visibles, donc je ne serais pas sûr que cette méthode fonctionnerait si, par exemple, vous faites défiler l'Dynamic
objet hors de la zone visible. Là encore, je n'ai pas essayé. En tout cas, je l'ai simplement proposé à titre de suggestion.Dynamic[Refresh[i++, UpdateInterval -> 1, TrackedSymbols -> {}]]
. Faites défiler le nombre incrémentiel de vue, attendez une minute, faites défiler vers l'arrière et voyez que le nombre n'est pas incrémenté de 60. À proposUpdateInterval
: ceci est généralement utilisé si possible, mais si votre code comprend des variables qui changent, ce changement déclenche une nouvelle actualisation avant le l'intervalle se termine. Essayez la ligne ci-dessus sansTrackedSymbols
N'oubliez pas que The Mathematica Book est également disponible en ligne à l' adresse http://reference.wolfram.com/legacy/v5_2/ - bien qu'il soit remplacé par la documentation actuelle sur http://reference.wolfram.com
la source
Je trouve très utile lors du développement de packages d'ajouter ce raccourci clavier à mon
SystemFiles/FrontEnd/TextResources/Windows/KeyEventTranslations.tr
fichier.Ensuite, pour chaque,
Packagename.m
jePackagenameTest.nb
crée un cahier de test et les 2 premières cellules du cahier de test sont définies comme cellules d'initialisation. Dans la première cellule j'ai mispour charger la très utile bibliothèque PackageManipulations qui a été écrite par Leonid. La deuxième cellule contient
qui font tous le rechargement du paquet. Notez que les deux premières lignes ne concernent que
Remove
tous les symboles car j'aime garder les contextes aussi propres que possible.Ensuite, le flux de travail pour écrire et tester un package devient quelque chose comme ça.
Packagename.m
.PackagenameTest.nb
et faitesCTRL + ALT + i
.Cela provoque le rechargement du package par les cellules d'initialisation, ce qui simplifie grandement les tests.
la source
La fonction suivante
format[expr_]
peut être utilisée pour indenter / formater desmathematica
expressions non formatées qui s'étendent sur une pageréf: /codegolf/3088/indent-a-string-using-given-parentheses
la source
format@RandomInteger[10,{3,3}]
): pastebin.com/nUT54Emq Puisque vous avez déjà les bases et que cela vous intéresse, pouvez-vous améliorer le code pour produire un formatage lisible? Ensuite, la prochaine étape serait de créer un bouton Coller qui créera une cellule d'entrée avec du code Mathematica bien indenté (en préservant de préférence les commentaires !!) Voir aussi ma question connexe .