Wir alle wissen, dass Mathematica großartig ist, aber es fehlt oft auch an kritischer Funktionalität. Welche externen Pakete / Tools / Ressourcen verwenden Sie mit Mathematica?
Ich werde diesen Hauptbeitrag bearbeiten (und auch andere dazu einladen), um Ressourcen aufzunehmen, die sich auf die allgemeine Anwendbarkeit in der wissenschaftlichen Forschung konzentrieren und die so vielen Menschen wie möglich nützlich sein werden. Fühlen Sie sich frei, irgendetwas beizutragen, auch kleine Code-Schnipsel (wie ich es unten für eine Timing-Routine getan habe).
Außerdem sind undokumentierte und nützliche Funktionen in Mathematica 7 und darüber hinaus, die Sie selbst gefunden oder von einem Papier / einer Website ausgegraben haben, sehr willkommen.
Bitte geben Sie eine kurze Beschreibung oder einen Kommentar dazu an, warum etwas großartig ist oder welches Dienstprogramm es bietet. Wenn Sie mit Affiliate-Links auf Bücher bei Amazon verlinken, erwähnen Sie dies bitte, indem Sie beispielsweise Ihren Namen hinter den Link setzen.
Pakete:
LevelScheme
ist ein Paket, das die Fähigkeit von Mathematica, gut aussehende Diagramme zu erstellen, erheblich erweitert. Ich benutze es, wenn nicht für irgendetwas anderes, dann für die viel, viel verbesserte Kontrolle über Rahmen- / Achsen-Ticks. Die neueste Version heißt SciDraw und wird noch in diesem Jahr veröffentlicht.- David Park's
Presentation Package
(50 US-Dollar - keine Gebühr für Updates) - Das
grassmannOps
Paket von Jeremy Michelson bietet Ressourcen für die Durchführung von Algebra und Kalkül mit Grassmann-Variablen und -Operatoren, die nicht triviale Kommutierungsbeziehungen haben. - John Browns
GrassmannAlgebra
Paket und Buch für die Arbeit mit Grassmann- und Clifford-Algebren. - RISC (Forschungsinstitut für symbolische Berechnung) bietet eine Vielzahl von Paketen für Mathematica (und andere Sprachen) zum Download an. Insbesondere ist es Theorema für automatisierte Theorembeweisen, und die Vielzahl der Pakete für die symbolische Summe, Differenzengleichungen, usw. auf der Software - Seite der Algorithmic Kombinatorik Gruppe .
Werkzeuge:
MASH
ist Daniel Reeves 'exzellentes Perl- Skript, das im Wesentlichen Skriptunterstützung für Mathematica v7 bietet. (Jetzt ab Mathematica 8 mit der-script
Option eingebaut .)- Ein
alternate Mathematica shell
mit einer GNU-Readline-Eingabe (mit Python, nur * nix) - Mit dem ColourMaths-Paket können Sie Teile eines Ausdrucks visuell auswählen und bearbeiten. http://www.dbaileyconsultancy.co.uk/colour_maths/colour_maths.html
Ressourcen:
Wolframs eigenes Repository
MathSource
bietet viele nützliche, wenn auch schmale Notizbücher für verschiedene Anwendungen. Schauen Sie sich auch die anderen Abschnitte an, wie zCurrent Documentation
,Courseware
für Vorträge,- und
Demos
für Demos.
Das Mathematica Wikibook .
Bücher:
- Mathematica-Programmierung: Eine erweiterte Einführung von Leonid Shifrin (
web
,pdf
) ist ein Muss, wenn Sie mehr als For- Schleifen in Mathematica ausführen möchten . Wir haben das Vergnügen,Leonid
hier Fragen beantworten zu können. - Quantenmethoden mit Mathematica von James F. Feagin ( amazon )
- Das Mathematica-Buch von Stephen Wolfram ( amazon ) (
web
) - Schaums Umriss ( amazon )
- Mathematica in Aktion von Stan Wagon ( Amazon ) - 600 Seiten mit tollen Beispielen und bis zu Mathematica Version 7. Visualisierungstechniken sind besonders gut, einige davon finden Sie auf der des Autors
Demonstrations Page
. - Mathematica Programming Fundamentals von Richard Gaylord (
pdf
) - Eine gute, prägnante Einführung in das meiste, was Sie über Mathematica-Programmierung wissen müssen. - Mathematica Cookbook von Sal Mangano veröffentlicht von O'Reilly 2010 832 Seiten. - Geschrieben im bekannten O'Reilly-Kochbuchstil: Problem - Lösung. Für Zwischenprodukte.
- Differentialgleichungen mit Mathematica, 3. Aufl. Elsevier 2004 Amsterdam von Martha L. Abell, James P. Braselton - 893 Seiten Für Anfänger lernen Sie gleichzeitig, DEs und Mathematica zu lösen.
Undokumentierte (oder kaum dokumentierte) Funktionen:
- So passen Sie Mathematica-Tastaturkürzel an Siehe
this question
. - Untersuchen von Mustern und Funktionen, die von Mathematicas eigenen Funktionen verwendet werden. Sehen
this answer
- Wie kann eine konsistente Größe für GraphPlots in Mathematica erreicht werden? Siehe
this question
. - Erstellen von Dokumenten und Präsentationen mit Mathematica. Siehe
this question
.
quelle
Grid
oder ähnliches zu erstellen .Antworten:
Ich habe erwähne dies vor, aber das Werkzeug , das ich am nützlichsten ist eine Anwendung von finden
Reap
undSow
welche ahmt / erweitert das VerhaltenGatherBy
:Auf diese Weise kann ich Listen nach beliebigen Kriterien gruppieren und dabei transformieren. So funktioniert es: Eine Kriterienfunktion (
f
) markiert jedes Element in der Liste, jedes Element wird dann von einer zweiten bereitgestellten Funktion (g
) transformiert und die spezifische Ausgabe wird von einer dritten Funktion (h
) gesteuert . Die Funktionh
akzeptiert zwei Argumente: ein Tag und eine Liste der gesammelten Elemente mit diesem Tag. Die Artikel behalten ihre ursprüngliche Reihenfolge bei. Wenn Sie also festlegen, erhaltenh = #1&
Sie eine unsortierteUnion
, wie in den Beispielen fürReap
. Es kann jedoch für die Sekundärverarbeitung verwendet werden.Als Beispiel für seine Nützlichkeit habe ich mit Wannier90 gearbeitet, das den räumlich abhängigen Hamilton-Operator wie folgt in eine Datei ausgibt, in der jede Zeile ein anderes Element in der Matrix ist
Um diese Liste in eine Reihe von Matrizen umzuwandeln, habe ich alle Unterlisten zusammengestellt, die dieselbe Koordinate enthalten, die Elementinformationen in eine Regel umgewandelt (dh {i, j} -> Re [Hij] + I Im [Hij]) und verwandelte dann die gesammelten Regeln in ein
SparseArray
All mit dem einen Liner:Ehrlich gesagt, das ist mein Schweizer Taschenmesser und es macht komplexe Dinge sehr einfach. Die meisten meiner anderen Tools sind etwas domänenspezifisch, daher werde ich sie wahrscheinlich nicht veröffentlichen. Die meisten, wenn nicht alle, beziehen sich jedoch auf sie
SelectEquivalents
.Bearbeiten : Es ahmt nicht vollständig
GatherBy
nach, da es nicht mehrere Ebenen des Ausdrucks so einfach wieGatherBy
möglich gruppieren kann. Funktioniert jedochMap
für das meiste, was ich brauche, einwandfrei.Beispiel : @Yaroslav Bulatov hat um ein in sich geschlossenes Beispiel gebeten. Hier ist eine aus meiner Forschung, die stark vereinfacht wurde. Nehmen wir also an, wir haben eine Reihe von Punkten in einer Ebene
und wir möchten die Anzahl der Punkte durch eine Reihe von Symmetrieoperationen reduzieren. (Für Neugierige generieren wir die kleine Gruppe jedes Punktes.) In diesem Beispiel verwenden wir eine vierfache Rotationsachse um die z-Achse
Mit können
SelectEquivalents
wir die Punkte, die denselben Satz von Bildern erzeugen, unter diesen Operationen gruppieren, dh sie sind äquivalentDies erzeugt 3 Unterlisten mit den entsprechenden Punkten. (Beachten Sie, dass dies
Union
hier unbedingt erforderlich ist, da dadurch sichergestellt wird, dass von jedem Punkt das gleiche Bild erzeugt wird. Ursprünglich habe ich es verwendetSort
, aber wenn ein Punkt auf einer Symmetrieachse liegt, ist er unter der Drehung um diese Achse unveränderlich und ergibt ein zusätzliches Bild von sich So.,Union
beseitigt diese zusätzlichen Bilder. AußerdemGatherBy
würde das gleiche Ergebnis.) in diesem Fall sind die Punkte bereits in einer Form , die ich benutze, aber ich brauche nur einen repräsentativen Punkt aus jeder Gruppe und mir würde eine Zählung gefallen der äquivalenten Punkte. Da ich nicht jeden Punkt transformieren muss, verwende ich dieIdentity
Funktion in der zweiten Position. Für die dritte Funktion müssen wir vorsichtig sein. Das erste Argument, das an es übergeben wird, sind die Bilder der Punkte unter den Rotationen, die für den Punkt{0,0,0}
eine Liste von vier identischen Elementen sind, und deren Verwendung würde die Zählung beeinträchtigen. Das zweite Argument ist jedoch nur eine Liste aller Elemente, die dieses Tag haben, sodass es nur enthält{0,0,0}
. In Code,Beachten Sie, dass dieser letzte Schritt genauso einfach von ausgeführt werden kann
Mit diesem und dem weniger vollständigen Beispiel oben ist jedoch leicht zu erkennen, wie sehr komplexe Transformationen mit einem Minimum an Code möglich sind.
quelle
Fortran
Codes, die ich gesehen habe.Fortran
Eines der schönen Dinge an der Mathematica-Notebook-Oberfläche ist, dass sie Ausdrücke in jeder Sprache auswerten kann , nicht nur in Mathematica. Als einfaches Beispiel sollten Sie einen neuen Shell- Eingabezelltyp erstellen , der den enthaltenen Ausdruck zur Auswertung an die Betriebssystem-Shell übergibt.
Definieren Sie zunächst eine Funktion, die die Auswertung eines Textbefehls an die externe Shell delegiert:
Das zweite Argument wird aus Gründen benötigt und ignoriert, die später ersichtlich werden. Als nächstes wollen wir einen neuen Stil namens Shell erstellen :
Shell
.Verwenden Sie den folgenden Zellausdruck als Text für Schritt 6 :
Der größte Teil dieses Ausdrucks wurde direkt aus dem integrierten Programmstil kopiert . Die wichtigsten Änderungen sind folgende Zeilen:
Evaluatable
Aktiviert die SHIFT + ENTER-Funktionalität für die Zelle. Bei der Auswertung wird dieCellEvaluationFunction
Übergabe des Zelleninhalts und des Inhaltstyps als Argumente aufgerufen (wobeishellEvaluate
das letztere Argument ignoriert wird).CellFrameLabels
ist nur eine nette Sache, mit der der Benutzer erkennen kann, dass diese Zelle ungewöhnlich ist.Mit all dem können wir nun einen Shell-Ausdruck eingeben und auswerten:
Es ist am besten, diesen definierten Stil in einem zentral angeordneten Stylesheet beizubehalten. Darüber hinaus lassen sich Bewertungsfunktionen wie Decubs am
shellEvaluate
besten mit DeclarePackage in definiereninit.m
. Die Einzelheiten dieser beiden Aktivitäten gehen über den Rahmen dieser Antwort hinaus.Mit dieser Funktion können Notizbücher erstellt werden, die Eingabeausdrücke in einer beliebigen Syntax von Interesse enthalten. Die Bewertungsfunktion kann in reiner Mathematica geschrieben sein oder einen oder alle Teile der Bewertung an eine externe Agentur delegieren. Seien Sie sich bewusst , dass es andere Haken sind , die Auswertung beziehen sich auf die Zelle, wie
CellEpilog
,CellProlog
undCellDynamicExpression
.Ein gängiges Muster besteht darin, den Text des Eingabeausdrucks in eine temporäre Datei zu schreiben, die Datei in einer bestimmten Sprache zu kompilieren, das Programm auszuführen und die Ausgabe für die endgültige Anzeige in der Ausgabezelle zu erfassen. Es gibt viele Details zu beachten, wenn eine vollständige Lösung dieser Art implementiert wird (z. B. die korrekte Erfassung von Fehlermeldungen), aber man muss die Tatsache zu schätzen wissen, dass dies nicht nur möglich, sondern auch praktisch ist.
Persönlich gesehen sind es Funktionen wie diese, die die Notebook-Oberfläche zum Zentrum meines Programmieruniversums machen.
Aktualisieren
Die folgende Hilfsfunktion ist nützlich, um solche Zellen zu erstellen:
Es wird folgendermaßen verwendet:
Wenn dies
shellCell[]
ausgewertet wird, wird die Eingabezelle gelöscht und durch eine neue Eingabezelle ersetzt, die ihren Inhalt als Shell-Befehl auswertet.quelle
CellEvaluationFunction
könnte auch für Low-Level-Syntax-Hacking verwendet werden, denke ich.CellEvaluationFunction
der Haken, den Sie gesucht haben?Cell
Option, die sich auf die Bewertung von Zellen bezieht -Evaluator -> "EvaluatorName"
. Die Bedeutung von"EvaluatorName"
kann über das Dialogfeld Evaluation :: Kernel Configuration Options ... konfiguriert werden . Ich weiß immer noch nicht, ob es möglich ist, es programmgesteuert zu konfigurieren ... Diese Technik ermöglicht es, verschiedene MathKernels in verschiedenenCell
s in einem Notebook zu verwenden. Diese MathKernels können aus verschiedenen Versionen von Mathematica installiert sein.Import
, oder einen externen Python-Prozess starten und über seine Streams kommunizieren (z. B. mit einem Java ProcessBuilder ). Ich bin sicher, es gibt einen besseren Mathematica-Weg - klingt nach einer guten SO-Frage :)Todd Gayley (Wolfram Research) hat mir gerade einen netten Hack geschickt, mit dem integrierte Funktionen mit beliebigem Code "umbrochen" werden können. Ich habe das Gefühl, dass ich dieses nützliche Instrument teilen muss. Das Folgende ist Todd's Antwort auf meine
question
.quelle
Unprotect
in der Tat sein, wurde einfach weggelassen . Der Punkt vonBlock
(dynamisches Scoping) und$inMsg
ist genau, um eine unendliche Rekursion zu verhindern. Da$inMsg
außerhalb undefiniert ist (dies ist eine wichtige Anforderung), wird zunächstTrueQ
ausgewertetFalse
und wir geben den Funktionskörper ein. Wenn wir jedoch den Funktionsaufruf im Körper haben, wird die Bedingung ausgewertetFalse
(da die Variable durch Block neu definiert wurde). Daher stimmt die benutzerdefinierte Regel nicht überein, und stattdessen wird die integrierte Regel verwendet.DownValues
zur Laufzeit neu definieren. Sie können sich diesen Beitrag groups.google.com/group/comp.soft-sys.math.mathematica/… als Beispiel ansehen (SetDelayed
Neudefinition). . Meine Methode ist jedoch weniger elegant, weniger robust, fehleranfälliger und macht die Implementierung der Rekursion weniger trivial. In den meisten Situationen gewinnt die von @Alexey beschriebene Methode zweifellos.Dies ist keine vollständige Ressource, daher werfe ich sie hier im Abschnitt "Antworten", aber ich habe sie als sehr nützlich empfunden, wenn ich Geschwindigkeitsprobleme herausgefunden habe (was leider einen großen Teil der Mathematik-Programmierung ausmacht).
Nutzung ist dann einfach
timeAvg@funcYouWantToTest
.EDIT: Mr. Wizard hat eine einfachere Version zur Verfügung gestellt , die weg tut mit
Throw
undCatch
und ist ein wenig einfacher zu parsen:EDIT: Hier ist eine Version von acl (von hier übernommen ):
quelle
Catch
undThrow
sollten mit eindeutigen Ausnahme-Tags verwendet worden sein.Throw
undCatch
" anstatt "Reap
undSow
".RepeatedTiming
zu tun.Internal`InheritedBlock
Ich habe kürzlich
Internal`InheritedBlock
aus dieser Botschaft von Daniel Lichtblau in der offiziellen Newsgroup erfahren, dass es so nützliche Funktionen gibt .Soweit ich weiß,
Internal`InheritedBlock
kann eine Kopie einer ausgehenden Funktion innerhalb desBlock
Gültigkeitsbereichs übergeben werden:Ich denke, diese Funktion kann für alle sehr nützlich sein, die eingebaute Funktionen vorübergehend ändern müssen!
Vergleich mit Block
Definieren wir eine Funktion:
Nun möchten wir eine Kopie dieser Funktion in den
Block
Bereich übergeben. Die naive Prüfung gibt nicht das, was wir wollen:Versuchen Sie nun, die verzögerte Definition im ersten Argument von zu verwenden
Block
(es ist auch eine undokumentierte Funktion):Wir sehen, dass in diesem Fall
a
funktioniert, aber wir haben keine Kopie des Originalsa
innerhalb desBlock
Bereichs.Versuchen wir jetzt
Internal`InheritedBlock
:Wir haben eine Kopie der ursprünglichen Definition für
a
innerhalb desBlock
Gültigkeitsbereichs und können sie nach unseren Wünschen ändern, ohne die globale Definition für zu beeinflussena
!quelle
Mathematica ist ein scharfes Werkzeug, aber es kann Sie mit seinem etwas untypisierten Verhalten und den Lawinen kryptischer Diagnosemeldungen schneiden . Eine Möglichkeit, damit umzugehen, besteht darin, Funktionen zu definieren, die dieser Redewendung folgen:
Das ist eine Menge Boilerplate, die ich häufig überspringen möchte. Besonders beim Prototyping, was in Mathematica häufig vorkommt. Also benutze ich ein Makro namens
define
, das es mir ermöglicht, diszipliniert zu bleiben, mit viel weniger Boilerplate.Eine grundlegende Verwendung von
define
ist wie folgt:Auf den ersten Blick sieht es nicht nach viel aus, aber es gibt einige versteckte Vorteile. Der erste Dienst, der
define
bereitgestellt wird, besteht darin, dass er automatischClearAll
auf das zu definierende Symbol angewendet wird. Dies stellt sicher, dass keine Restdefinitionen vorhanden sind - ein häufiges Ereignis bei der anfänglichen Entwicklung einer Funktion.Der zweite Dienst besteht darin, dass die zu definierende Funktion automatisch "geschlossen" wird. Damit meine ich, dass die Funktion eine Nachricht ausgibt und abbricht, wenn sie mit einer Argumentliste aufgerufen wird, die nicht mit einer der Definitionen übereinstimmt:
Dies ist der primäre Wert von
define
, der eine sehr häufige Fehlerklasse abfängt.Ein weiterer Vorteil ist die übersichtliche Möglichkeit, Attribute für die zu definierende Funktion anzugeben. Machen wir die Funktion
Listable
:Akzeptiert zusätzlich zu allen normalen Attributen
define
ein zusätzliches Attribut namensOpen
. Dies verhindertdefine
, dass der Funktion die Gesamtfehlerdefinition hinzugefügt wird:Für eine Funktion können mehrere Attribute definiert werden:
Hier ist ohne weiteres die Definition von
define
:Die gezeigte Implementierung unterstützt weder Aufwärtswerte noch Currying noch allgemeinere Muster als die einfache Funktionsdefinition. Es bleibt jedoch nützlich.
quelle
Beginnen Sie, ohne dass ein leeres Notizbuch geöffnet ist
Es störte mich, Mathematica mit einem leeren Notizbuch beginnen zu lassen. Ich könnte dieses Notizbuch mit einem Skript schließen, aber es würde immer noch kurz aufblitzen. Mein Hack ist es, eine Datei zu erstellen, die Folgendes
Invisible.nb
enthält:Und füge dies zu meinem hinzu
Kernel\init.m
:Ich starte jetzt Mathematica durch Öffnen
Invisible.nb
Es mag einen besseren Weg geben, aber das hat mir gut getan.
Kundenspezifisch
Fold
undFoldList
Fold[f, x]
wird gleichgesetzt gemacht zuFold[f, First@x, Rest@x]
Ich glaube übrigens, dass dies seinen Weg in eine zukünftige Version von Mathematica finden könnte.Überraschung! Dies wurde implementiert, ist jedoch derzeit nicht dokumentiert. Ich bin informiert, dass es 2011 von Oliver Ruebenkoenig implementiert wurde, anscheinend nicht lange nachdem ich dies gepostet habe. Danke Oliver Ruebenkoenig!
Aktualisiert, um dies zu ermöglichen:
"Dynamische Partition"
Eine neue Version dieser Funktion finden Sie in Mathematica.SE Post # 7512 .
Häufig möchte ich eine Liste nach einer Längenfolge aufteilen.
Pseudocode-Beispiel:
partition[{1,2,3,4,5,6}, {2,3,1}]
Ausgabe:
{{1,2}, {3,4,5}, {6}}
Ich habe mir das ausgedacht:
Was ich dann damit abgeschlossen habe, einschließlich Argumenttests:
Das dritte Argument steuert, was mit Elementen außerhalb der Split-Spezifikation geschieht.
Szabolcs 'Mathematica-Tricks
Die von mir am häufigsten verwendete ist die Tabelle zum Einfügen tabellarischer Daten
Ändern Sie externe Daten von innen
Compile
Kürzlich hat Daniel Lichtblau diese Methode gezeigt, die ich noch nie gesehen hatte. Meiner Meinung nach erweitert es den Nutzen von erheblich
Compile
quelle
Compile
- mein ganzer Beitrag hier: stackoverflow.com/questions/5246330/… - sollte diese Möglichkeit in einer nicht trivialen Umgebung demonstrieren (es gab bereits eine kürzere und schnellere Lösung für das fragliche Problem) . IMO, der größte Gewinn hierbei ist die Möglichkeit, Pass-by-Reference zu emulieren und große kompilierte Funktionen in besser verwaltbare und wiederverwendbare Blöcke zu unterteilen.Allgemeine PDF / EMF-Exportprobleme und -lösungen
1) Es ist völlig unerwartet und nicht dokumentiert, aber Mathematica exportiert und speichert Grafiken in PDF- und EPS-Formaten unter Verwendung einer Reihe von Stildefinitionen, die sich von denen unterscheiden, die für die Anzeige von Notebooks auf dem Bildschirm verwendet werden. Standardmäßig werden Notebooks auf dem Bildschirm in der Stilumgebung "Arbeiten" angezeigt (dies ist der Standardwert für die
ScreenStyleEvironment
globale$FrontEnd
Option), sie werden jedoch in der"Printout"
Stilumgebung gedruckt (dies ist der Standardwert für diePrintingStyleEnvironment
globale$FrontEnd
Option). Wenn man Grafiken in Rasterformaten wie GIF und PNG oder im EMF-Format exportiert, generiert Mathematica Grafiken, die genau so aussehen, wie sie in Notebook aussehen. Es scheint, dass die"Working"
In diesem Fall wird die Stilumgebung zum Rendern verwendet. Dies ist jedoch nicht der Fall, wenn Sie etwas im PDF- oder EPS-Format exportieren / speichern! In diesem Fall"Printout"
wird standardmäßig die Stilumgebung verwendet , die sich stark von der Stilumgebung "Arbeiten" unterscheidet. Zunächst wird die"Printout"
StilumgebungMagnification
auf 80% festgelegt . Zweitens werden eigene Werte für die Schriftgrößen verschiedener Stile verwendet. Dies führt zu inkonsistenten Änderungen der Schriftgröße in der generierten PDF-Datei im Vergleich zur ursprünglichen Bildschirmdarstellung. Letzteres kann als FontSize-Schwankungen bezeichnet werden, die sehr ärgerlich sind. Glücklicherweise kann dies vermieden werden, indem diePrintingStyleEnvironment
globale$FrontEnd
Option auf "Arbeiten" gesetzt wird :2) Das häufigste Problem beim Exportieren in das EMF-Format besteht darin, dass die meisten Programme (nicht nur Mathematica ) eine Datei generieren, die in der Standardgröße gut aussieht, aber beim Vergrößern hässlich wird. Dies liegt daran, dass Metadateien mit der Genauigkeit der Bildschirmauflösung abgetastet werden . Die Qualität der generierten EMF-Datei kann verbessert werden, indem
Magnify
das ursprüngliche grafische Objekt verwendet wird, sodass die Genauigkeit der Abtastung der ursprünglichen Grafiken viel präziser wird. Vergleichen Sie zwei Dateien:Wenn Sie diese Dateien in Microsoft Word einfügen und vergrößern, sehen Sie, dass das erste "a" einen Sägezahn aufweist, während das zweite nicht (getestet mit Mathematica 6).
Ein anderer Weg
ImageResolution
wurde von Chris Degnen vorgeschlagen (diese Option wirkt sich zumindest ab Mathematica 8 aus):3) In Mathematica gibt es drei Möglichkeiten, Grafiken in Metadateien umzuwandeln: über
Export
bis"EMF"
(dringend empfohlen: Erzeugt Metadateien mit höchstmöglicher Qualität), über denSave selection As...
Menüpunkt ( erzeugt eine viel weniger genaue Zahl , nicht empfohlen) und über denEdit ► Copy As ► Metafile
Menüpunkt ( ich empfehle dringend gegen diese Route ).quelle
Auf vielfachen Wunsch wird der Code zum Generieren des Top-10-SO-Antwort-Plots (mit Ausnahme von Anmerkungen ) mithilfe der SO-API erstellt .
quelle
Caching-Ausdrücke
Ich finde diese Funktionen sehr hilfreich, um jeden Ausdruck zwischenzuspeichern. Das Interessante an diesen beiden Funktionen ist, dass der gehaltene Ausdruck selbst als Schlüssel für die Hashtabelle / das Symbol Cache oder CacheIndex verwendet wird, verglichen mit der bekannten Memoisierung in Mathematica, bei der Sie das Ergebnis nur zwischenspeichern können, wenn die Funktion wie f definiert ist [x_]: = f [x] = ... Sie können also jeden Teil eines Codes zwischenspeichern. Dies ist nützlich, wenn eine Funktion mehrmals aufgerufen werden soll, aber nur einige Teile des Codes nicht neu berechnet werden dürfen.
Um einen Ausdruck unabhängig von seinen Argumenten zwischenzuspeichern.
Beim zweiten Mal gibt der Ausdruck 6 zurück, ohne zu warten.
Zwischenspeichern eines Ausdrucks mithilfe eines Alias-Ausdrucks, der von einem Argument des zwischengespeicherten Ausdrucks abhängen kann.
Wenn die Berechnung von expr einige Zeit in Anspruch nimmt, ist es viel schneller, {"f", 2} auszuwerten, um beispielsweise das zwischengespeicherte Ergebnis abzurufen.
Eine Variation dieser Funktionen für einen lokalisierten Cache (dh der Cache-Speicher wird automatisch außerhalb des Blockkonstrukts freigegeben) finden Sie in diesem Beitrag. Vermeiden Sie wiederholte Aufrufe der Interpolation
Zwischengespeicherte Werte löschen
So löschen Sie zwischengespeicherte Werte, wenn Sie die Anzahl der Definitionen einer Funktion nicht kennen. Ich bin der Meinung, dass Definitionen irgendwo in ihren Argumenten ein Leerzeichen haben.
Löschen zwischengespeicherter Werte, wenn Sie die Anzahl der Definitionen einer Funktion kennen (geht etwas schneller).
Dies nutzt die Tatsache, dass Definitionen einer Funktion am Ende ihrer DownValues-Liste stehen und zwischengespeicherte Werte vor.
Verwenden von Symbolen zum Speichern von Daten und objektähnlichen Funktionen
Auch hier gibt es interessante Funktionen zur Verwendung von Symbolen wie Objekten.
Es ist bereits bekannt, dass Sie Daten in Symbolen speichern und mit DownValues schnell darauf zugreifen können
Sie können mit diesen Funktionen auf die Liste der Schlüssel (oder Eigenschaften) eines Symbols zugreifen, basierend auf den Dreeves, die in einem Beitrag auf dieser Site eingereicht wurden:
Ich benutze diese Funktion häufig, um alle Informationen anzuzeigen, die in den DownValues eines Symbols enthalten sind:
Schließlich gibt es hier eine einfache Möglichkeit, ein Symbol zu erstellen, das sich in der objektorientierten Programmierung wie ein Objekt verhält (es gibt nur das grundlegendste Verhalten von OOP wieder, aber ich finde die Syntax elegant):
Eigenschaften werden als DownValues und Methoden als verzögerte Upvalues in dem von Module erstellten Symbol gespeichert, das zurückgegeben wird. Ich habe die Syntax für function2 gefunden, die die übliche OO-Syntax für Funktionen in der Tree-Datenstruktur in Mathematica ist .
Eine Liste der vorhandenen Wertetypen für jedes Symbol finden Sie unter http://reference.wolfram.com/mathematica/tutorial/PatternsAndTransformationRules.html und http://www.verbeia.com/mathematica/tips/HTMLLinks/Tricks_Misc_4.html .
Versuchen Sie dies zum Beispiel
Sie können weiter gehen , wenn Sie Objektvererbung mit einem Paket emulieren wollen genannt InheritRules hier http://library.wolfram.com/infocenter/MathSource/671/
Sie können die Funktionsdefinition auch nicht in newObject, sondern in einem Typensymbol speichern. Wenn NewObject also anstelle von newObject den Typ [newObject] zurückgibt, können Sie Funktion und Funktion2 außerhalb von NewObject (und nicht innerhalb) wie folgt definieren und dieselbe Verwendung wie zuvor verwenden .
Verwenden Sie UpValues [Typ], um zu sehen, dass Funktion und Funktion2 im Typensymbol definiert sind.
Weitere Ideen zu dieser letzten Syntax finden Sie hier https://mathematica.stackexchange.com/a/999/66 .
Verbesserte Version von SelectEquivalents
@rcollyer: Vielen Dank, dass Sie SelectEquivalents an die Oberfläche gebracht haben. Es ist eine erstaunliche Funktion. Hier ist eine verbesserte Version von SelectEquivalents, die oben aufgeführt ist und mehr Möglichkeiten und Optionen bietet. Dies erleichtert die Verwendung.
Hier sind Beispiele, wie diese Version verwendet werden kann:
Verwenden von Mathematica Gather / Collect richtig
Wie würden Sie eine PivotTable-Funktion in Mathematica ausführen?
Mathematica schneller 2D-Binning-Algorithmus
Interne Tasche
Daniel Lichtblau beschreibt hier eine interessante interne Datenstruktur für wachsende Listen.
Implementierung eines Quadtree in Mathematica
Debugging-Funktionen
Diese beiden Beiträge verweisen auf nützliche Funktionen zum Debuggen:
Wie debugge ich beim Schreiben kleiner oder großer Codes mit Mathematica? Werkbank? mma debugger? oder etwas anderes? (Zeig es)
/programming/5459735/the-clearest-way-to-represent-mathematicas-evaluation-sequence/5527117#5527117 (TraceView)
Hier ist eine weitere Funktion, die auf Reap und Sow basiert, um Ausdrücke aus verschiedenen Teilen eines Programms zu extrahieren und in einem Symbol zu speichern.
Hier ist ein Beispiel
Andere Ressourcen
Hier ist eine Liste interessanter Links für Lernzwecke:
Eine Sammlung von Mathematica-Lernressourcen
Hier aktualisiert: https://mathematica.stackexchange.com/a/259/66
quelle
f[x_] := f[x] = some code
gelöscht wird.c:Cache[expr_] := c = expr
.SelectEquivalents
. Ich denke, ich würdeTagOnElement
als zweiten Parameter voreingestellt bleiben,Identity
da er der am häufigsten verwendete ist. Ich glaube auch nicht, dass ich aufgenommen habeFinalOp
, da es innerhalb behandelt werden kannOpOnTaggedElems
. Ich würde auch die Optionsnamen kürzen, da ihre Länge das Tippen umständlich macht. Versuchen SieTagFunction
,TransformElement
,TransformResults
, undTagPattern
stattdessen. BeidesTagPattern
undMapLevel
sind großartige Ergänzungen der Funktionalität und insgesamt ein gutes Umschreiben.Meine Dienstprogrammfunktionen (ich habe diese in MASH integriert, was in der Frage erwähnt wird):
quelle
Ein Trick, den ich verwendet habe, mit dem Sie die Art und Weise emulieren können, wie die meisten integrierten Funktionen mit schlechten Argumenten arbeiten (indem Sie eine Nachricht senden und dann das gesamte Formular ohne Bewertung zurückgeben), nutzt eine Eigenart der Funktionsweise aus,
Condition
wenn sie in einer Definition verwendet werden. Wennfoo
sollte nur mit einem Argument arbeiten:Wenn Sie komplexere Anforderungen haben, können Sie die Argumentvalidierung und Nachrichtengenerierung leicht als unabhängige Funktion herausrechnen. Sie können aufwändigere Dinge tun, indem Sie Nebenwirkungen verwenden, die
Condition
über das Generieren von Nachrichten hinausgehen. Meiner Meinung nach fallen die meisten jedoch in die Kategorie "Sleazy Hack" und sollten nach Möglichkeit vermieden werden.Wenn Sie in der Kategorie "Metaprogrammierung" eine Mathematica package (
.m
) -Datei haben, können Sie das"HeldExpressions"
Element verwenden , um alle Ausdrücke in der eingeschlossenen Datei abzurufenHoldComplete
. Dies macht das Aufspüren viel einfacher als die Verwendung textbasierter Suchvorgänge. Leider gibt es keine einfache Möglichkeit, dasselbe mit einem Notebook zu tun, aber Sie können alle Eingabeausdrücke wie folgt abrufen:Zuletzt können Sie die Tatsache verwenden, dass
Module
lexikalische Abschlüsse emuliert werden, um das Äquivalent von Referenztypen zu erstellen. Hier ist ein einfacher Stapel (derCondition
als Bonus eine Variation des Tricks zur Fehlerbehandlung verwendet):Jetzt können Sie die Elemente einer Liste in umgekehrter Reihenfolge unnötig verschlungen drucken!
quelle
HeldExpressions
Element in Paketen, war sich dessen nicht bewusst. Normalerweise habe ich als String importiert und dannToExpression
mitHoldComplete
als letztes Argument verwendet. In Bezug auf die VerwendungCondition
für Nachrichten - dies ist seit mindestens 1994 eine Standardtechnik beim Schreiben von Paketen. In Bezug auf die Persistenz durchModule
Vars - habe ich vor einiger Zeit einen langen Beitrag dazu in Mathgroup verfasst: groups.google.com/group/comp.soft- sys.math.mathematica /… (mein dritter Beitrag in diesem Thread), dies ist in die gleiche Richtung und enthält Links zu einigen nicht trivialen Anwendungsbeispielen.Condition
Ding als Überlieferung aufgegriffen , wahrscheinlich von einem Kollegen, aber nicht bemerkt , dass es eine Standardtechnik ist. Der Link zur Verwendung vonModule
Symbolen als Referenztypen ist interessant!Drucksystem-Symboldefinitionen ohne vorangestellten Kontext
Die folgende
contextFreeDefinition[]
Funktion versucht, die Definition eines Symbols ohne den häufigsten vorangestellten Kontext zu drucken. Die Definition kann dann in die Workbench kopiert und zur besseren Lesbarkeit formatiert werden (auswählen, Rechtsklick, Quelle -> Format)withRules []
Vorsichtsmaßnahme: Diese Funktion lokalisiert Variablen nicht auf die gleiche Weise
With
undModule
tut dies auch. Dies bedeutet, dass verschachtelte Lokalisierungskonstrukte nicht wie erwartet funktionieren.withRules[{a -> 1, b -> 2}, With[{a=3}, b_ :> b]]
wird ersetzena
undb
in der verschachteltenWith
undRule
, währendWith
dies nicht tut.Dies ist eine Variante
With
, die Regeln anstelle von=
und verwendet:=
:Ich fand dies nützlich, wenn ich Code bereinigte, der während des Experimentierens geschrieben wurde, und Variablen lokalisierte. Gelegentlich erhalte ich Parameterlisten in Form von
{par1 -> 1.1, par2 -> 2.2}
. MitwithRules
Parameter können Werte einfach in Code eingefügt werden, der zuvor mit globalen Variablen geschrieben wurde.Die Verwendung ist wie folgt
With
:Antialiasing 3D-Grafiken
Dies ist eine sehr einfache Technik für Antialias-3D-Grafiken, auch wenn Ihre Grafikhardware dies nicht nativ unterstützt.
Hier ist ein Beispiel:
Beachten Sie, dass ein großer Wert für
n
oder eine große Bildgröße dazu neigt, Grafik-Treiberfehler aufzudecken oder Artefakte einzuführen.Notebook Diff-Funktionalität
Die Notebook-Diff-Funktionalität ist im
<<AuthorTools`
Paket und (zumindest in Version 8) im undokumentiertenNotebookTools`
Kontext verfügbar . Dies ist eine kleine Benutzeroberfläche, um zwei derzeit geöffnete Notebooks zu unterscheiden:quelle
a = 3; b = 4;
vor Ihrem Beispielaufruf zuweisen und dann aufrufenwithRules
. Sie können es speichern, indem Sie stattdessen Folgendes verwenden :SetAttributes[withRules, HoldAll];withRules[rules_, expr_] := Unevaluated[expr] /. Unevaluated[rules]
. Die Unterschiede in Bezug auf die Semantik vonWith
damals: 1. Die Seiten von Regeln werden jetzt nicht ausgewertet. 2. LöstwithRules
die Namenskonflikte mit Konstrukten mit innerem Gültigkeitsbereich nicht wieWith
folgt auf. Der letzte ist ziemlich ernst - je nach Fall gut oder schlecht.With
ob verschachtelte s nicht behandelt werden . Dies funktioniert auch nicht immer mit den eingebauten Lokalisierungskonstrukten, zWith[{a=1}, Block[{a=2}, a]]
. B. Glauben Sie, dass es einen guten Grund gibt, warum die verschachteltenBlock
nicht dort lokalisiert sind, wie verschachteltWith
undModule
?)Unevaluated[rules]
weil ichx -> 1+1
die RHS auswerten wollte .With
s sind leicht zu erkennen und zu vermeiden, Muster jedoch nicht:With[{a = 1}, a_ -> a]
Lokalisiert das Innere,a
währendwithRules
dies nicht der Fall ist. Wissen Sie, ob es eine Möglichkeit gibt, auf den internen Lokalisierungsmechanismus von Mathematica zuzugreifen und neue Konstrukte (ähnlichRule
) zu erstellen, die ebenfalls lokalisieren? Ich werde diese Antwort wahrscheinlich später löschen, da sie eher gefährlich als nützlich ist, aber ich würde gerne zuerst ein bisschen mehr damit spielen.InheritedBlock
ziemlich cool und löst das Problem sehr elegant. Bei den Scoping-Konflikten treten normalerweise Bindungen für das lexikalische Scoping zur "lexikalischen Bindungszeit" auf, dh vor der Laufzeit, während das dynamische Scoping zur Laufzeit gebunden wird, was dies möglicherweise erklärt. Sie können dies dem ähnlichen Fall für gegenüberstellenModule
, der eine konstruktive Verwendung ermöglicht (siehe z . B. hier stackoverflow.com/questions/7394113/… ). Das Problem ist, dassBlock
ein Symbol benötigt wird, um ...Rekursive reine Funktionen (
#0
) scheinen eine der dunkleren Ecken der Sprache zu sein. Hier sind einige nicht triviale Beispiele für ihre Verwendung, bei denen dies wirklich nützlich ist (nicht, dass sie ohne sie nicht möglich sind). Das Folgende ist eine ziemlich präzise und relativ schnelle Funktion, um verbundene Komponenten in einem Diagramm zu finden, wenn eine Liste von Kanten als Eckpunktpaare angegeben wird:Was hier passiert, ist, dass wir zuerst ein Dummy-Symbol auf jede der Scheitelpunktnummern abbilden und dann einen Weg einrichten, der bei einem gegebenen Scheitelpunktpaar
{f[5],f[10]}
dannf[5]
ausgewertet wirdf[10]
. Die rekursive reine Funktion wird als Pfadkompressor verwendet (um die Memoisierung so einzurichten, dassf[1]=f[3],f[3]=f[4],f[4]=f[2], ...
gespeicherte Werte anstelle von langen Ketten korrigiert werden, wenn eine neue "Wurzel" der Komponente entdeckt wird. Dies führt zu einer erheblichen Beschleunigung. Da wir Zuweisungen verwenden, muss es HoldAll sein, was dieses Konstrukt noch dunkler und attraktiver macht. Diese Funktion ist das Ergebnis einer Online- und Offline-Diskussion in der Mathgroup, an der Fred Simons, Szabolcs Horvat, DrMajorBob und Ihre Mitarbeiter beteiligt sind. Beispiel:Es ist sicherlich viel langsamer als ein eingebautes, aber für die Größe des Codes ziemlich schnell noch IMO.
Ein weiteres Beispiel: Hier ist eine rekursive Realisierung von
Select
, basierend auf verknüpften Listen und rekursiven reinen Funktionen:Beispielsweise,
Es ist jedoch nicht richtig rekursiv und wird den Stapel für größere Listen sprengen (den Kernel zum Absturz bringen). Hier ist die schwanzrekursive Version:
Beispielsweise,
quelle
Dies ist ein Rezept aus Stan Wagons Buch ... verwenden Sie es, wenn sich das eingebaute Diagramm aufgrund mangelnder Präzision unregelmäßig verhält
Ich verwende oft den folgenden Trick von Kristjan Kannike, wenn ich ein "wörterbuchartiges" Verhalten von Mathematicas Abwärtswerten benötige
Wenn die Bewertungsergebnisse verwirrend sind, ist es manchmal hilfreich, Bewertungsschritte in eine Textdatei zu kopieren
quelle
Es ist möglich, MathKernel im Batch-Modus auszuführen, indem Sie undokumentierte Befehlszeilenoptionen verwenden
-batchinput
und-batchoutput
:(Wo
input.m
ist die Batch-Eingabedatei, die mit dem Zeilenumbruchzeichen endet,outputfile.txt
ist die Datei, in die die Ausgabe umgeleitet wird).In Mathematica v.> = 6 verfügt der MathKernel über eine undokumentierte Befehlszeilenoption:
Hiermit wird gesteuert, ob der MathKernel ein sichtbares Symbol in der Taskleiste hat (zumindest unter Windows).
Das FrontEnd (zumindest ab Version 5) verfügt über eine undokumentierte Befehlszeilenoption
Dadurch wird der Begrüßungsbildschirm deaktiviert und das Mathematica FrontEnd kann viel schneller ausgeführt werden
und Option
die deaktiviert den Mechanismus, startet die jüngste Mathematica - Version installiert statt startet die Version , die mit .nb Dateien in der Systemregistrierung.
Ein anderer Weg , dies wahrscheinlich zu tun ist :
Es ist praktisch, die letzte Befehlszeilenoption mit der Einstellung der globalen FrontEnd-Option zu kombinieren,
VersionedPreferences->True
die das Teilen von Einstellungen zwischen verschiedenen installierten Mathematica- Versionen deaktiviert :(Das Obige sollte in der neuesten installierten Mathematica- Version ausgewertet werden .)
In Mathematica 8 wird dies im Dialogfeld "Einstellungen" im Bereich "System" unter der Einstellung "Versionsspezifische Front-End-Einstellungen erstellen und verwalten" gesteuert .
Es ist möglich, eine unvollständige Liste der Befehlszeilenoptionen des FrontEnd zu erhalten, indem Sie einen undokumentierten Schlüssel
-h
(den Code für Windows) verwenden:gibt:
Weitere Optionen sind:
Gibt es andere potenziell nützliche Befehlszeilenoptionen für MathKernel und FrontEnd? Bitte teilen Sie, wenn Sie wissen.
Verwandte Frage .
quelle
-32
und bedeutet, dass die Bittigkeit des vom FrontEnd verwendeten MathKernels mit der Bitterkeit des Betriebssystems (64-Bit) übereinstimmt. In anderen Fällen scheint diese Option nichts zu ändern.Meine Lieblings-Hacks sind kleine Code-generierende Makros, mit denen Sie eine Reihe von Standard-Boilerplate-Befehlen durch einen kurzen ersetzen können. Alternativ können Sie Befehle zum Öffnen / Erstellen von Notizbüchern erstellen.
Folgendes verwende ich seit einiger Zeit in meinem täglichen Mathematica-Workflow. Ich habe Folgendes oft ausgeführt:
All dies immer und immer wieder von Hand zu tun, ist ein Schmerz, also lasst uns automatisieren! Zunächst ein Dienstprogrammcode:
Erstellen wir nun ein Makro, das die folgenden Zellen in das Notizbuch einfügt:
Und hier ist das Makro:
Wenn ich jetzt
MyPrivatize[]
tippe, wird der private Kontext erstellt und mein Standardpaket geladen. Jetzt erstellen wir einen Befehl, der ein neues Notizbuch mit einem eigenen privaten Kontext öffnet (damit Sie dort mit wilder Hingabe hacken können, ohne die Definitionen zu verfälschen), aber Zugriff auf Ihre aktuellen Kontexte hat.Das Coole daran ist, dass
SelfDestruct
der Befehl beim Ausführen keine Spuren im aktuellen Notizbuch hinterlässt - was gut ist, da es sonst nur zu Unordnung kommen würde.Für zusätzliche Stilpunkte können Sie Keyword-Trigger für diese Makros erstellen
InputAutoReplacements
, aber ich überlasse dies dem Leser als Übung.quelle
PutAppend mit PageWidth -> Infinity
In Mathematica ist die Verwendung des
PutAppend
Befehls die einfachste Möglichkeit, eine laufende Protokolldatei mit Ergebnissen von Zwischenberechnungen zu verwalten. Die Standardeinstellung wird jedochPageWith->78
beim Exportieren von Ausdrücken in eine Datei verwendet. Daher kann nicht garantiert werden, dass jede Zwischenausgabe nur eine Zeile im Protokoll enthält.PutAppend
hat selbst keine Optionen, aber die Verfolgung seiner Auswertungen zeigt, dass es auf derOpenAppend
Funktion basiert, die über diePageWith
Option verfügt, und ermöglicht, den Standardwert durch den folgendenSetOptions
Befehl zu ändern :So können wir immer
PutAppend
nur eine Zeile anhängen, indem wir Folgendes einstellen:AKTUALISIEREN
In Version 10 wurde ein Fehler eingeführt (in Version 11.3 behoben):
SetOptions
Das Verhalten vonOpenWrite
und wird nicht mehr beeinflusstOpenAppend
.Eine Problemumgehung besteht darin, eine eigene Version von
PutAppend
mit expliziterPageWidth -> Infinity
Option zu implementieren :Beachten Sie, dass wir es auch
WriteString
wie in dieser Antwort gezeigt implementieren können. In diesem Fall ist es jedoch erforderlich, den Ausdruck vorab in das entsprechendeInputForm
Via umzuwandelnToString[expr, InputForm]
.quelle
Ich habe gerade eines meiner Pakete nach Aufnahme durchsucht und einige von mir definierte Nachrichten gefunden, die Wunder wirken :
Debug::<some name>
. Standardmäßig sind sie deaktiviert, daher entsteht kein großer Overhead. Aber ich kann meinen Code mit ihnen verunreinigen und sie einschalten, wenn ich genau herausfinden muss, wie sich ein bisschen Code verhält.quelle
Debug
nochTrace
Funktionen; Es handelt sich um eine Reihe von Nachrichten, mit denen ich meinen Code verunreinigen kann, um sie nach Belieben ein- und auszuschalten. Ihnen wird das Wort vorangestelltDebug
, genauso wie einerusage
Nachricht der Name der Funktion vorangestellt wird. Es bietet die gleiche Funktionalität wie das Platzieren einer Reihe voncout
Anweisungen in C ++ - Code.Eines der Dinge, die mich an den integrierten Scoping-Konstrukten stören, ist, dass sie alle lokalen Variablendefinitionen gleichzeitig auswerten, sodass Sie beispielsweise nicht schreiben können
Vor einiger Zeit habe ich mir ein Makro namens WithNest ausgedacht, mit dem Sie dies tun können. Ich finde es praktisch, da Sie damit variable Bindungen lokal halten können, ohne etwas Ähnliches tun zu müssen
Am Ende war der beste Weg, dies zu tun, die Verwendung eines speziellen Symbols, um das Durchblättern der Liste der Bindungen zu erleichtern, und ich habe die Definition in ein eigenes Paket eingefügt, um dieses Symbol verborgen zu halten. Vielleicht hat jemand eine einfachere Lösung für dieses Problem?
Wenn Sie es ausprobieren möchten, fügen Sie Folgendes in eine Datei mit dem Namen ein
Scoping.m
:quelle
Dieser wurde von Alberto Di Lullo geschrieben (der nicht auf Stack Overflow zu sein scheint).
CopyToClipboard
, für Mathematica 7 (in Mathematica 8 ist es eingebaut)Ursprünglicher Beitrag: http://forums.wolfram.com/mathgroup/archive/2010/Jun/msg00148.html
Ich habe diese Routine nützlich gefunden, um große reelle Zahlen in gewöhnlicher Dezimalform in die Zwischenablage zu kopieren. Z.B
CopyToClipboard["123456789.12345"]
Cell[OutputFormData@expr]
entfernt ordentlich die Anführungszeichen.quelle
Dieser Code erstellt eine Palette, die die Auswahl als Bild in Stack Exchange hochlädt. Unter Windows wird eine zusätzliche Schaltfläche bereitgestellt, mit der die Auswahl genauer wiedergegeben werden kann.
Kopieren Sie den Code in eine Notizbuchzelle und werten Sie ihn aus. Nehmen Sie dann die Palette aus der Ausgabe heraus und installieren Sie sie mit
Palettes -> Install Palette...
Wenn Sie Probleme damit haben, schreiben Sie hier einen Kommentar. Laden Sie die Notebook - Version hier .
quelle
Ich bin sicher, dass viele Leute auf die Situation gestoßen sind, in der sie einige Dinge ausführen, und festgestellt haben, dass dies nicht nur das Programm blockiert, sondern auch die letzten 10 Minuten nicht gespeichert hat!
BEARBEITEN
Nachdem ich einige Zeit darunter gelitten hatte, fand ich eines Tages heraus, dass man das automatische Speichern aus dem Mathematica- Code heraus erstellen kann . Ich denke, dass mir die Verwendung eines solchen automatischen Speicherns in der Vergangenheit sehr geholfen hat, und ich hatte immer das Gefühl, dass die Möglichkeit selbst etwas ist, von dem nicht viele Menschen wissen, dass sie es können.
Der ursprüngliche Code, den ich verwendet habe, befindet sich unten. Dank der Kommentare habe ich herausgefunden, dass es problematisch ist und dass es viel besser ist, es auf alternative Weise mit
ScheduledTask
(was nur in Mathematica 8 funktioniert ) zu tun .Code dafür finden Sie in dieser Antwort von
Sjoerd C. de Vries
(Da ich nicht sicher bin, ob es in Ordnung ist, ihn hierher zu kopieren, lasse ich ihn nur als Link.)Die folgende Lösung verwendet
Dynamic
. Das Notebook wird alle 60 Sekunden gespeichert , aber anscheinend nur, wenn seine Zelle sichtbar ist . Ich lasse es hier nur aus Fertigstellungsgründen. (und für Benutzer von Mathematica 6 und 7)/BEARBEITEN
Um es zu lösen, verwende ich diesen Code am Anfang eines Notizbuchs:
Dies spart Ihre Arbeit alle 60 Sekunden.
Ich bevorzuge es,
NotebookAutoSave[]
weil es gespeichert wird, bevor die Eingabe verarbeitet wird, und weil einige Dateien mehr Text als Eingabe sind.Ich habe es ursprünglich hier gefunden: http://en.wikipedia.org/wiki/Talk:Mathematica#Criticisms
Beachten Sie, dass nach dem Ausführen dieser Zeile das Speichern auch dann erfolgt, wenn Sie Ihre Datei schließen und erneut öffnen (solange die dynamische Aktualisierung aktiviert ist).
Da es in Mathematica kein Rückgängigmachen gibt , sollten Sie darauf achten, nicht alle Inhalte zu löschen, da diese durch das Speichern irreversibel werden (vorsichtshalber entferne ich diesen Code von jedem fertigen Notizbuch).
quelle
NotebookSave[SelectedNotebook[], "work-" <> IntegerString[i] <> ".nb"]; i++
, aber ich denke, dass jede Art von Verweis auf den aktuellen Notizbuchnamen rekursiv wird.Dynamic
Objekte werden nur aktualisiert, wenn sie sichtbar sind, daher wäre ich mir nicht sicher, ob diese Methode funktionieren würde, wenn Sie beispielsweise dasDynamic
Objekt aus dem sichtbaren Bereich scrollen . Andererseits habe ich es nicht versucht. Auf jeden Fall habe ich es nur als Vorschlag angeboten.Dynamic[Refresh[i++, UpdateInterval -> 1, TrackedSymbols -> {}]]
. Scrollen Sie die inkrementierende Zahl aus dem Blickfeld, warten Sie eine Minute, scrollen Sie zurück und sehen Sie, dass die Zahl nicht um 60 erhöht wird. InfoUpdateInterval
: Dies wird normalerweise verwendet, wenn dies möglich ist. Wenn Ihr Code jedoch Variablen enthält, die sich ändern, löst diese Änderung eine neue Aktualisierung vor dem aus Intervall endet. Versuchen Sie die obige Zeile ohneTrackedSymbols
Denken Sie daran, dass das Mathematica-Buch auch online unter http://reference.wolfram.com/legacy/v5_2/ verfügbar ist - obwohl es durch die aktuelle Dokumentation unter http://reference.wolfram.com ersetzt wird
quelle
Ich finde es sehr nützlich, wenn ich Pakete entwickle, um diese Tastenkombination zu meiner
SystemFiles/FrontEnd/TextResources/Windows/KeyEventTranslations.tr
Datei hinzuzufügen .Als nächstes
Packagename.m
mache ich für jedes einPackagenameTest.nb
Notizbuch zum Testen und die ersten 2 Zellen des Testnotizbuchs werden als Initialisierungszellen festgelegt. In die erste Zelle habe ich gesetztum die sehr nützliche PackageManipulations- Bibliothek zu laden, die von Leonid geschrieben wurde. Die zweite Zelle enthält
die alle das eigentliche Paket neu laden. Beachten Sie, dass die ersten beiden Zeilen nur für
Remove
alle Symbole gelten, da ich die Kontexte so sauber wie möglich halten möchte.Dann wird der Workflow zum Schreiben und Testen eines Pakets ungefähr so.
Packagename.m
.PackagenameTest.nb
und machCTRL + ALT + i
.Dies führt dazu, dass die Initialisierungszellen das Paket neu laden, was das Testen sehr einfach macht.
quelle
Die folgende Funktion
format[expr_]
kann verwendet werden, um unformatiertemathematica
Ausdrücke einzurücken / zu formatieren , die sich über eine Seite erstreckenRef: /codegolf/3088/indent-a-string-using-given-parentheses
quelle
format@RandomInteger[10,{3,3}]
) angewendet wird : pastebin.com/nUT54Emq Da Sie bereits über die Grundlagen verfügen und daran interessiert sind, können Sie den Code verbessern eine sinnvoll lesbare Formatierung erstellen? Dann wäre der nächste Schritt, eine Schaltfläche zum Einfügen zu erstellen, die eine Eingabezelle mit gut eingerücktem Mathematica-Code erstellt (vorzugsweise Kommentare beibehalten !!). Siehe auch meine verwandte Frage .