Wszyscy wiemy, że Mathematica jest świetna, ale często brakuje jej krytycznej funkcjonalności. Jakich zewnętrznych pakietów / narzędzi / zasobów używasz w Mathematica?
Zmienię (i zaproszę do tego wszystkich innych) ten post główny, aby uwzględnić zasoby, które koncentrują się na ogólnym zastosowaniu w badaniach naukowych i które będą przydatne dla jak największej liczby osób. Zapraszam do przesyłania czegokolwiek, nawet małych fragmentów kodu (tak jak zrobiłem poniżej dla procedury synchronizacji).
Ponadto mile widziane są nieudokumentowane i przydatne funkcje w Mathematica 7 i nowszych, które znalazłeś lub wykopałeś z jakiegoś dokumentu / strony.
Prosimy o dołączenie krótkiego opisu lub komentarza, dlaczego coś jest świetne lub jakie zapewnia użyteczność. Jeśli umieszczasz linki do książek na Amazon za pomocą linków partnerskich, wspomnij o tym, np. Umieszczając swoje imię i nazwisko po łączu.
Pakiety:
LevelScheme
to pakiet, który znacznie rozszerza możliwości Mathematica w tworzeniu ładnych wykresów. Używam go jeśli nie do niczego innego, to do znacznie, znacznie ulepszonej kontroli tików ramy / osi. Jego najnowsza wersja nosi nazwę SciDraw i zostanie wydana w tym roku.- David Park's
Presentation Package
(50 USD - brak opłat za aktualizacje) grassmannOps
Pakiet Jeremy'ego Michelsona zapewnia zasoby do wykonywania algebry i rachunku różniczkowego ze zmiennymi Grassmanna i operatorami, które mają nietrywialne relacje komutacji.GrassmannAlgebra
Pakiet i książka Johna Browna do pracy z algebrami Grassmanna i Clifforda.- RISC (Research Institute for Symbolic Computation ) udostępnia do pobrania różne pakiety dla Mathematica (i innych języków). W szczególności istnieje teoria dotycząca automatycznego dowodzenia twierdzeń oraz wiele pakietów do sumowania symbolicznego, równań różnicowych itp. Na stronie oprogramowania grupy Algorithmic Combinatorics .
Przybory:
MASH
to doskonały skrypt Perla Daniela Reevesa, który zasadniczo zapewnia obsługę skryptów dla Mathematica v7. (Teraz wbudowany w Mathematica 8 z-script
opcją).- An
alternate Mathematica shell
z wejściem GNU readline (przy użyciu Pythona, tylko * nix) - Pakiet ColourMaths umożliwia wizualne wybieranie części wyrażenia i manipulowanie nimi. http://www.dbaileyconsultancy.co.uk/colour_maths/colour_maths.html
Zasoby:
Własne repozytorium Wolfram
MathSource
ma wiele przydatnych, jeśli wąskie notatniki do różnych zastosowań. Sprawdź również inne sekcje, takie jakCurrent Documentation
,Courseware
na wykłady,- i
Demos
, no cóż, dema.
Książki:
- Programowanie w matematyce: zaawansowane wprowadzenie autorstwa Leonida Shifrina (
web
,pdf
) to lektura obowiązkowa, jeśli chcesz zrobić coś więcej niż pętle For w programie Mathematica. Mamy przyjemnośćLeonid
odpowiadać na pytania tutaj. - Metody kwantowe z Mathematica autorstwa Jamesa F. Feagina ( amazon )
- The Mathematica Book autorstwa Stephena Wolframa ( amazon ) (
web
) - Zarys Schauma ( Amazon )
- Mathematica in Action autorstwa Stana Wagona ( amazon ) - 600 stron zgrabnych przykładów i przechodzi do wersji Mathematica 7. Techniki wizualizacji są szczególnie dobre, niektóre z nich można zobaczyć u autora
Demonstrations Page
. - Podstawy programowania w Mathematica autorstwa Richarda Gaylorda (
pdf
) - Dobre, zwięzłe wprowadzenie do większości tego, co powinieneś wiedzieć o programowaniu w Mathematica. - Mathematica Cookbook autorstwa Sal Mangano opublikowana przez O'Reilly 2010 832 strony. - Napisane w znanym stylu książki kucharskiej O'Reilly: Problem - rozwiązanie. Do półproduktów.
- Równania różniczkowe z Mathematica, wyd. 3. Elsevier 2004 Amsterdam, autor: Martha L. Abell, James P. Braselton - 893 strony Dla początkujących, ucz się rozwiązywania DE i Mathematica w tym samym czasie.
Nieudokumentowane (lub słabo udokumentowane) funkcje:
- Jak dostosować skróty klawiaturowe Mathematica. Widzieć
this question
. - Jak sprawdzić wzorce i funkcje używane przez własne funkcje Mathematica. Widzieć
this answer
- Jak osiągnąć spójny rozmiar GraphPlots w Mathematica? Widzieć
this question
. - Jak tworzyć dokumenty i prezentacje w Mathematica. Zobacz
this question
.
źródło
Grid
lub cokolwiek podobnego.Odpowiedzi:
Pisałem to wcześniej, ale narzędzie znaleźć najbardziej przydatne jest stosowanie
Reap
iSow
który naśladuje / rozszerza zachowanieGatherBy
:Dzięki temu mogę grupować listy według dowolnych kryteriów i przekształcać je w trakcie. Sposób działania polega na tym, że funkcja kryterialna (
f
) oznacza każdy element na liście, każdy element jest następnie przekształcany przez drugą podaną funkcję (g
), a określone wyjście jest kontrolowane przez trzecią funkcję (h
). Funkcjah
przyjmuje dwa argumenty: tag i listę zebranych elementów, które mają ten tag. Pozycje zachowują oryginalną kolejność, więc jeśli ustawiszh = #1&
, otrzymasz nieposortowanyUnion
, jak w przykładach dlaReap
. Ale może być używany do wtórnego przetwarzania.Jako przykład jego użyteczności pracowałem z Wannier90, który generuje zależny przestrzennie hamiltonian do pliku, w którym każda linia jest innym elementem macierzy, w następujący sposób
Aby przekształcić tę listę w zestaw macierzy, zebrałem wszystkie podlisty, które zawierają tę samą współrzędną, przekształciłem informacje o elementach w regułę (tj. {I, j} -> Re [Hij] + I Im [Hij]) i następnie przekształcił zebrane zasady w
SparseArray
wszystko z jednym wkładem:Szczerze mówiąc, to jest mój szwajcarski scyzoryk i bardzo upraszcza złożone rzeczy. Większość moich innych narzędzi jest w pewnym stopniu specyficzna dla domeny, więc prawdopodobnie ich nie opublikuję. Jednak większość z nich, jeśli nie wszystkie, zawiera odniesienia
SelectEquivalents
.Edycja : nie naśladuje całkowicie
GatherBy
, ponieważ nie może grupować wielu poziomów wyrażenia tak prosto, jak toGatherBy
możliwe. JednakMap
działa dobrze w przypadku większości tego, czego potrzebuję.Przykład : @Yaroslav Bulatov poprosił o samodzielny przykład. Oto jedno z moich badań, które zostało znacznie uproszczone. Więc powiedzmy, że mamy zbiór punktów na płaszczyźnie
i chcielibyśmy zredukować liczbę punktów o zestaw operacji symetrii. (Dla ciekawskich, tworzymy małą grupę każdego punktu.) W tym przykładzie użyjmy czterokrotnej osi obrotu wokół osi Z
Używając
SelectEquivalents
możemy pogrupować punkty, które tworzą ten sam zestaw obrazów w ramach tych operacji, tj. Są równoważne, używając następującegoco daje 3 podlisty zawierające równoważne punkty. (Uwaga,
Union
jest tutaj absolutnie niezbędne, ponieważ zapewnia, że ten sam obraz jest tworzony przez każdy punkt. Pierwotnie użyłemSort
, ale jeśli punkt leży na osi symetrii, jest niezmienny pod obrotem wokół tej osi, dając dodatkowy obraz samego siebie . ZatemUnion
eliminuje te dodatkowe obrazy. RównieżGatherBy
dałoby ten sam wynik.) W tym przypadku punkty są już w formie, której będę używać, ale potrzebuję tylko reprezentatywnego punktu z każdej grupy i chciałbym policzyć równoważnych punktów. Ponieważ nie muszę przekształcać każdego punktu, używamIdentity
funkcja na drugiej pozycji. W przypadku trzeciej funkcji musimy być ostrożni. Pierwszym przekazanym argumentem będą obrazy punktów pod obrotami, które dla punktu{0,0,0}
są listą czterech identycznych elementów, a użycie go zrzuciłoby zliczenie. Jednak drugi argument to tylko lista wszystkich elementów, które mają ten tag, więc będzie zawierał tylko{0,0,0}
. W kodzie,Uwaga, ten ostatni krok można równie łatwo wykonać za pomocą
Ale dzięki temu i mniej kompletnemu przykładowi powyżej łatwo jest zobaczyć, jak bardzo złożone transformacje są możliwe przy minimalnej ilości kodu.
źródło
Fortran
kodów, jakie widziałem. Prawie rozważam użycieFortran
...Jedną z fajnych rzeczy w interfejsie notatnika Mathematica jest to, że może on oceniać wyrażenia w dowolnym języku, nie tylko w Mathematica. Jako prosty przykład rozważ utworzenie nowego typu komórki wejściowej Shell, która przekazuje zawarte wyrażenie do powłoki systemu operacyjnego w celu oceny.
Najpierw zdefiniuj funkcję, która deleguje ocenę polecenia tekstowego do powłoki zewnętrznej:
Drugi argument jest potrzebny i zignorowany z powodów, które ujawnią się później. Następnie chcemy stworzyć nowy styl o nazwie Shell :
Shell
.Użyj następującego wyrażenia komórki jako tekstu kroku 6 :
Większość tego wyrażenia została skopiowana bezpośrednio z wbudowanego stylu programu . Kluczowe zmiany to te linie:
Evaluatable
włącza funkcjonalność SHIFT + ENTER dla komórki. Ocena wywołaCellEvaluationFunction
przekazanie zawartości komórki i typu zawartości jako argumentów (shellEvaluate
ignoruje drugi argument).CellFrameLabels
to tylko drobiazg, który pozwala użytkownikowi zidentyfikować, że ta komórka jest niezwykła.Mając to wszystko na miejscu, możemy teraz wprowadzić i ocenić wyrażenie powłoki:
Najlepiej jest zachować ten zdefiniowany styl w centralnie umieszczonym arkuszu stylów. Ponadto funkcje oceny, takie jak
shellEvaluate
są najlepiej definiowane jako kody pośredniczące przy użyciu DeclarePackage winit.m
. Szczegóły obu tych działań wykraczają poza zakres tej odpowiedzi.Dzięki tej funkcji można tworzyć notatniki zawierające wyrażenia wejściowe w dowolnej składni. Funkcja oceny może być napisana w czystej postaci Mathematica lub delegować część lub wszystkie części oceny zewnętrznej agencji. Należy pamiętać, że istnieją inne haki, które odnoszą się do oceny komórek, jak
CellEpilog
,CellProlog
iCellDynamicExpression
.Typowy wzorzec obejmuje zapisanie tekstu wyrażenia wejściowego do pliku tymczasowego, kompilację pliku w jakimś języku, uruchomienie programu i przechwycenie danych wyjściowych do ostatecznego wyświetlenia w komórce wyjściowej. Jest wiele szczegółów, na które należy zwrócić uwagę przy wdrażaniu pełnego rozwiązania tego rodzaju (np. Prawidłowe przechwytywanie komunikatów o błędach), ale należy docenić fakt, że takie rzeczy są nie tylko możliwe, ale praktyczne.
Z osobistego punktu widzenia to właśnie takie funkcje sprawiają, że interfejs notebooka jest centrum mojego wszechświata programowania.
Aktualizacja
Do tworzenia takich komórek przydatna jest następująca funkcja pomocnicza:
Jest używany w ten sposób:
Teraz, jeśli
shellCell[]
zostanie oszacowane, komórka wejściowa zostanie usunięta i zastąpiona nową komórką wejściową, która ocenia jej zawartość jako polecenie powłoki.źródło
CellEvaluationFunction
może być również użyty do hakowania składni niskiego poziomu.CellEvaluationFunction
haczyk, którego szukałeś?Cell
opcja związana z oceną komórki -Evaluator -> "EvaluatorName"
. Znaczenie"EvaluatorName"
można skonfigurować w oknie dialogowym Evaluation :: Kernel Configuration Options ... Nadal nie wiem, czy możliwe jest współkonfigurowanie go programowo ... Ta technika pozwala na używanie różnych MathKernels w różnych wersjachCell
w jednym Notatniku. Te MathKernels mogą pochodzić z różnych zainstalowanych wersji Mathematica .Import
, a może nawet uruchamiać zewnętrzny proces Pythona i komunikować się za pośrednictwem jego strumieni (np. Za pomocą Java ProcessBuilder ). Jestem pewien, że jest lepszy sposób Mathematica - brzmi jak dobre pytanie SO :)Todd Gayley (Wolfram Research) właśnie przysłał mi fajny hack, który pozwala „opakować” wbudowane funkcje dowolnym kodem. Czuję, że muszę się podzielić tym przydatnym narzędziem. Poniżej znajduje się odpowiedź Todda na mój
question
.źródło
Unprotect
rzeczywiście musi być, zostało po prostu pominięte. CelemBlock
(dynamicznego określania zakresu) i$inMsg
jest właśnie zapobieganie nieskończonej rekurencji. Ponieważ$inMsg
jest niezdefiniowana na zewnątrz (jest to ważny wymóg), na początkuTrueQ
szacuje się doFalse
i wchodzimy do treści funkcji. Ale kiedy mamy wywołanie funkcji wewnątrz ciała, warunek ocenia się naFalse
(ponieważ zmienna została przedefiniowana przez Block). W związku z tym reguła zdefiniowana przez użytkownika nie jest dopasowywana, a zamiast niej używana jest reguła wbudowana.DownValues
w czasie wykonywania, możesz spojrzeć na ten post groups.google.com/group/comp.soft-sys.math.mathematica/ ... na przykład (SetDelayed
redefinition) . Ale moja metoda jest mniej elegancka, mniej niezawodna, bardziej podatna na błędy i sprawia, że odejście od rekurencji jest znacznie mniej proste w implementacji. Tak więc w większości sytuacji metoda opisana przez @Alexey wygrywa.Nie jest to kompletny zasób, więc wrzucam go tutaj w sekcji odpowiedzi, ale uznałem go za bardzo przydatny przy rozwiązywaniu problemów z szybkością (co niestety jest dużą częścią tego, o co chodzi w programowaniu w Mathematica).
Użycie jest wtedy proste
timeAvg@funcYouWantToTest
.EDIT: Pan Kreator dostarczył prostszą wersję, która znosi
Throw
iCatch
i jest nieco łatwiejsze do analizowania:EDYCJA: Oto wersja z ACL (pobrana stąd ):
źródło
Catch
iThrow
powinny być używane z unikalnymi tagami wyjątków.Throw
iCatch
”, a nie „Reap
iSow
”.RepeatedTiming
trzeba to zrobić.Internal`InheritedBlock
Niedawno dowiedziałem się o istnieniu tak użytecznej funkcji jak
Internal`InheritedBlock
z wiadomości Daniela Lichtblau w oficjalnej grupie dyskusyjnej.Jak rozumiem,
Internal`InheritedBlock
pozwala na przekazanie kopii funkcji wychodzącej wewnątrzBlock
zakresu:Myślę, że ta funkcja może być bardzo przydatna dla każdego, kto musi tymczasowo zmodyfikować wbudowane funkcje!
Porównanie z Block
Zdefiniujmy jakąś funkcję:
Teraz chcemy przekazać kopię tej funkcji do
Block
zakresu. Naiwna próba nie daje tego, czego chcemy:Teraz próbuję użyć opóźnionej definicji w pierwszym argumencie
Block
(jest to również funkcja nieudokumentowana):Widzimy, że w tym przypadku
a
działa, ale nie mamy kopii oryginałua
wBlock
lunecie.Teraz spróbujmy
Internal`InheritedBlock
:Mamy kopię oryginalnej definicji
a
wewnątrzBlock
zakresu i możemy ją zmodyfikować w dowolny sposób bez wpływu na globalną definicjęa
!źródło
Mathematica to ostre narzędzie, ale może cię zranić swoim nieco nietypowym zachowaniem i lawiną tajemniczych komunikatów diagnostycznych . Jednym ze sposobów radzenia sobie z tym jest zdefiniowanie funkcji według tego idiomu:
To dużo schematów, które często kuszę, aby pomijać. Zwłaszcza podczas prototypowania, co w Mathematica często się zdarza. Tak więc używam makra o nazwie,
define
które pozwala mi zachować dyscyplinę, przy znacznie mniejszym schemacie.Podstawowe użycie
define
jest takie:Na początku nie wygląda to na dużo, ale są pewne ukryte korzyści. Pierwsza usługa
define
zapewnia, to automatyczne zastosowanieClearAll
do definiowanego symbolu. Gwarantuje to, że nie ma żadnych resztek definicji - co jest częstym zjawiskiem podczas początkowego tworzenia funkcji.Druga usługa polega na tym, że definiowana funkcja jest automatycznie „zamykana”. Rozumiem przez to, że funkcja wyśle komunikat i przerwie działanie, jeśli zostanie wywołana z listą argumentów, która nie jest zgodna z żadną z definicji:
To jest podstawowa wartość
define
, która wyłapuje bardzo powszechną klasę błędów.Innym udogodnieniem jest zwięzły sposób określania atrybutów definiowanej funkcji. Zróbmy funkcję
Listable
:Oprócz wszystkich normalnych atrybutów
define
akceptuje dodatkowy atrybut o nazwieOpen
. Zapobiega todefine
dodawaniu definicji błędu typu catch-all do funkcji:Dla funkcji można zdefiniować wiele atrybutów:
Bez zbędnych ceregieli, oto definicja
define
:Przedstawiona implementacja nie obsługuje wartości w górę ani curry, ani wzorców bardziej ogólnych niż prosta definicja funkcji. Pozostaje jednak przydatna.
źródło
Zacznij bez otwartego pustego notatnika
Martwiło mnie, że Mathematica zaczynała od pustego zeszytu. Mógłbym zamknąć ten notatnik skryptem, ale i tak by się przez chwilę otworzył. Mój hack polega na utworzeniu pliku
Invisible.nb
zawierającego:I dodaj to do mojego
Kernel\init.m
:Teraz zaczynam Mathematica od otwarcia
Invisible.nb
Może jest lepszy sposób, ale to mi dobrze służyło.
Dostosowane
Fold
iFoldList
Fold[f, x]
jest równoważneFold[f, First@x, Rest@x]
Nawiasem mówiąc, uważam, że może się to znaleźć w przyszłej wersji Mathematica.Niespodzianka! Zostało to wdrożone, chociaż obecnie nie jest to udokumentowane. Poinformowano mnie, że został on wdrożony w 2011 roku przez Olivera Ruebenkoeniga, podobno niedługo po tym, jak to opublikowałem. Dziękuję Oliver Ruebenkoenig!
Zaktualizowano, aby to umożliwić:
„Partycja dynamiczna”
Zobacz Mathematica.SE post # 7512 dla nowej wersji tej funkcji.
Często chcę podzielić listę według kolejności długości.
przykład pseudokodu:
partition[{1,2,3,4,5,6}, {2,3,1}]
Wynik:
{{1,2}, {3,4,5}, {6}}
Wymyśliłem to:
Które następnie zakończyłem tym, w tym testowaniem argumentów:
Trzeci argument kontroluje, co dzieje się z elementami poza specyfikacją podziału.
Sztuczki Szabolcsa Mathematica
Najczęściej używam palety Wklej dane tabelaryczne
Modyfikuj dane zewnętrzne z poziomu
Compile
Ostatnio Daniel Lichtblau pokazał metodę, której nigdy wcześniej nie widziałem. Moim zdaniem znacznie zwiększa użyteczność
Compile
źródło
Compile
- cały mój post tutaj: stackoverflow.com/questions/5246330/… , miał na celu zaprezentowanie tej możliwości w nietrywialnym ustawieniu (było już tam zamieszczone krótsze i szybsze rozwiązanie omawianego problemu) . IMO, największą wygraną jest tutaj możliwość emulacji przekazywania przez odniesienie i dzielenia dużych skompilowanych funkcji na łatwiejsze do zarządzania i wielokrotnego użytku fragmenty.Ogólne problemy i rozwiązania dotyczące eksportu PDF / EMF
1) Jest to całkowicie nieoczekiwane i nieudokumentowane, ale Mathematica eksportuje i zapisuje grafikę w formatach PDF i EPS przy użyciu zestawu definicji stylów, który różni się od używanego do wyświetlania notatników na ekranie. Domyślnie Notatniki są wyświetlane na ekranie w środowisku stylu „Praca” (co jest wartością domyślną dla opcji
ScreenStyleEvironment
globalnej$FrontEnd
), ale są drukowane w"Printout"
środowisku stylu (co jest wartością domyślną dla opcjiPrintingStyleEnvironment
globalnej$FrontEnd
). Kiedy eksportuje się grafikę w formatach rastrowych, takich jak GIF i PNG lub w formacie EMF, do renderowania używane jest środowisko w stylu Mathematica generuje grafikę, która wygląda dokładnie tak, jak wygląda w programie Notebook. Wygląda na to, że"Working"
. Ale tak nie jest, gdy eksportujesz / zapisujesz cokolwiek w formatach PDF lub EPS! W tym przypadku"Printout"
środowisko stylu jest używane domyślnie bardzo różni się to od środowiska stylu pracy. Przede wszystkim, że"Printout"
zestawy styl miejscaMagnification
do 80% . Po drugie, używa własnych wartości dla rozmiarów czcionek w różnych stylach, co powoduje niespójne zmiany rozmiaru czcionki w wygenerowanym pliku PDF w porównaniu z oryginalną reprezentacją na ekranie. Te ostatnie można nazwać fluktuacjami FontSize, które są bardzo irytujące. Ale na szczęście można tego uniknąć , ustawiając opcjęPrintingStyleEnvironment
globalną$FrontEnd
na „Praca” :2) Powszechnym problemem związanym z eksportowaniem do formatu EMF jest to, że większość programów (nie tylko Mathematica ) generuje plik, który wygląda ładnie przy domyślnym rozmiarze, ale staje się brzydki po powiększeniu. Dzieje się tak, ponieważ metapliki są próbkowane z wierną rozdzielczością ekranu . Jakość wygenerowanego pliku EMF można
Magnify
poprawić, wprowadzając oryginalny obiekt graficzny, dzięki czemu dokładność próbkowania oryginalnej grafiki staje się znacznie bardziej precyzyjna. Porównaj dwa pliki:Jeśli wstawisz te pliki do programu Microsoft Word i powiększysz je, zobaczysz, że pierwsze „a” ma na nim ząb piłowany, a drugie nie (testowane z Mathematica 6).
Inne rozwiązanie
ImageResolution
zasugerował Chris Degnen (ta opcja działa przynajmniej począwszy od Mathematica 8):3) W Mathematica mamy trzy sposoby na konwersję grafiki do metapliku: poprzez
Export
do"EMF"
(zdecydowanie zalecany sposób: tworzy metaplik o najwyższej możliwej jakości), poprzezSave selection As...
pozycję menu ( tworzy znacznie mniej dokładną figurę , niezalecane) i poprzezEdit ► Copy As ► Metafile
pozycję menu ( zdecydowanie polecam przeciwko tej trasie ).źródło
Na popularne żądanie kod do generowania wykresu 10 najlepszych odpowiedzi na SO (z wyjątkiem adnotacji ) przy użyciu SO API .
źródło
Wyrażenia buforowania
Uważam, że te funkcje są bardzo pomocne w buforowaniu dowolnego wyrażenia. Ciekawą rzeczą w przypadku tych dwóch funkcji jest to, że samo przetrzymywane wyrażenie jest używane jako klucz pamięci podręcznej tablicy / symbolu lub CacheIndex, w porównaniu do dobrze znanego zapamiętywania w mathematica, w którym można buforować wynik tylko wtedy, gdy funkcja jest zdefiniowana jak f [x_]: = f [x] = ... Więc możesz buforować dowolną część kodu, jest to przydatne, jeśli funkcja ma być wywoływana kilka razy, ale tylko niektóre części kodu nie mogą być ponownie obliczane.
Aby buforować wyrażenie niezależnie od jego argumentów.
Za drugim razem wyrażenie zwraca 6 bez czekania.
Aby buforować wyrażenie przy użyciu wyrażenia aliasu, które może zależeć od argumentu wyrażenia w pamięci podręcznej.
Jeśli obliczenie wyrażenia zajmuje trochę czasu, znacznie szybciej jest oszacować {"f", 2}, na przykład w celu pobrania wyniku z pamięci podręcznej.
Odmiana tych funkcji, aby mieć zlokalizowaną pamięć podręczną (tj. Pamięć podręczna jest automatycznie zwalniana poza konstrukcją Block), zobacz ten post Unikaj powtarzających się wywołań interpolacji
Usuwanie wartości z pamięci podręcznej
Aby usunąć wartości zapisane w pamięci podręcznej, gdy nie znasz liczby definicji funkcji. Uważam, że definicje mają gdzieś puste miejsce w swoich argumentach.
Aby usunąć wartości zapisane w pamięci podręcznej, gdy znasz liczbę definicji funkcji (działa nieco szybciej).
Wykorzystuje to fakt, że definicje funkcji znajdują się na końcu ich listy DownValues, a buforowane wartości znajdują się przed.
Używanie symboli do przechowywania danych i funkcji podobnych do obiektów
Również tutaj są interesujące funkcje do używania symboli, takich jak obiekty.
Powszechnie wiadomo, że można przechowywać dane w symbolach i szybko uzyskiwać do nich dostęp za pomocą DownValues
Możesz uzyskać dostęp do listy kluczy (lub właściwości) symbolu za pomocą tych funkcji w oparciu o to, co dreeves przesłał w poście na tej stronie:
Często używam tej funkcji, aby wyświetlić wszystkie informacje zawarte w DownValues symbolu:
Wreszcie, oto prosty sposób na stworzenie symbolu, który zachowuje się jak obiekt w programowaniu obiektowym (po prostu odtwarza najbardziej podstawowe zachowanie OOP, ale uważam składnię za elegancką):
Właściwości są przechowywane jako DownValues, a metody jako opóźnione Upvalues w symbolu utworzonym przez Module, który jest zwracany. Znalazłem składnię function2, która jest zwykłą składnią OO dla funkcji w strukturze danych drzewa w Mathematica .
Aby zapoznać się z listą istniejących typów wartości, które ma każdy symbol, zobacz http://reference.wolfram.com/mathematica/tutorial/PatternsAndTransformationRules.html i http://www.verbeia.com/mathematica/tips/HTMLLinks/Tricks_Misc_4.html .
Na przykład spróbuj tego
Możesz przejść dalej, jeśli chcesz emulować dziedziczenie obiektów za pomocą pakietu o nazwie InheritRules dostępnego tutaj http://library.wolfram.com/infocenter/MathSource/671/
Możesz również przechowywać definicję funkcji nie w newObject, ale w symbolu typu, więc jeśli NewObject zwrócił typ [newObject] zamiast newObject, możesz zdefiniować funkcję i funkcję2 w ten sposób poza NewObject (a nie wewnątrz) i mieć takie samo zastosowanie jak poprzednio .
Użyj UpValues [typ], aby zobaczyć, że funkcja i funkcja2 są zdefiniowane w symbolu typu.
Dalsze pomysły dotyczące tej ostatniej składni przedstawiono tutaj https://mathematica.stackexchange.com/a/999/66 .
Ulepszona wersja SelectEquivalents
@rcollyer: Wielkie dzięki za udostępnienie SelectEquivalents, to niesamowita funkcja. Oto ulepszona wersja SelectEquivalents wymienionych powyżej z większymi możliwościami i korzystaniem z opcji, dzięki czemu jest łatwiejsza w użyciu.
Oto przykłady wykorzystania tej wersji:
Prawidłowe korzystanie z Mathematica Gather / Collect
Jak wykonałbyś funkcję tabeli przestawnej w Mathematica?
Szybki algorytm binningu 2D Mathematica
Torba wewnętrzna
Daniel Lichtblau opisuje tutaj interesującą wewnętrzną strukturę danych dla rosnących list.
Implementacja Quadtree w Mathematica
Funkcje debugowania
Te dwa posty wskazują przydatne funkcje do debugowania:
Jak debugować podczas pisania małych lub dużych kodów za pomocą Mathematica? stoł warsztatowy? debugger mma? albo coś innego? (Pokaż to)
/programming/5459735/the-clearest-way-to-represent-mathematicas-evaluation-sequence/5527117#5527117 (TraceView)
Oto kolejna funkcja oparta na Reap and Sow do wyodrębniania wyrażeń z różnych części programu i przechowywania ich w symbolu.
Oto przykład
Inne zasoby
Oto lista interesujących linków do celów edukacyjnych:
Zbiór zasobów edukacyjnych Mathematica
Zaktualizowano tutaj: https://mathematica.stackexchange.com/a/259/66
źródło
f[x_] := f[x] = some code
zapamiętania.c:Cache[expr_] := c = expr
. : .SelectEquivalents
. Myślę, żeTagOnElement
jako drugi parametr pozostawiłbym domyślne ustawienie,Identity
ponieważ jest najczęściej używany z nich. Myślę, że też nie bym go włączyłFinalOp
, ponieważ można sobie z tym poradzićOpOnTaggedElems
. Skróciłbym również nazwy opcji, ponieważ ich długość sprawia, że pisanie jest niewygodne. SpróbujTagFunction
,TransformElement
,TransformResults
, aTagPattern
zamiast tego. Oba,TagPattern
iMapLevel
są świetne dodatki do funkcjonalności, a dobry przepisać wierzchnie.Moje funkcje narzędziowe (mam je wbudowane w MASH, o czym jest mowa w pytaniu):
źródło
Jedna sztuczka, której użyłem, która pozwala na emulację sposobu, w jaki większość wbudowanych funkcji działa ze złymi argumentami (wysyłając wiadomość, a następnie zwracając cały formularz bez oceny), wykorzystuje dziwaczny sposób
Condition
działania, gdy jest używany w definicji. Jeślifoo
powinno działać tylko z jednym argumentem:Jeśli masz bardziej złożone potrzeby, łatwo jest rozliczyć walidację argumentów i generowanie wiadomości jako niezależną funkcję. Możesz zrobić bardziej skomplikowane rzeczy, używając efektów ubocznych
Condition
nie tylko do generowania wiadomości, ale moim zdaniem większość z nich należy do kategorii „marny hack” i należy ich unikać, jeśli to możliwe.Ponadto w kategorii „metaprogramming”, jeśli masz
.m
plik package ( ) programu Mathematica , możesz użyć"HeldExpressions"
elementu, aby uzyskać wszystkie wyrażenia zawarte w plikuHoldComplete
. To sprawia, że śledzenie rzeczy jest znacznie łatwiejsze niż korzystanie z wyszukiwania tekstowego. Niestety, nie ma łatwego sposobu na zrobienie tego samego z notebookiem, ale możesz uzyskać wszystkie wyrażenia wejściowe za pomocą czegoś takiego:Wreszcie, możesz wykorzystać fakt, że
Module
emuluje zamknięcia leksykalne, aby stworzyć odpowiednik typów referencyjnych. Oto prosty stos (który wykorzystuje odmianęCondition
sztuczki do obsługi błędów jako bonus):Teraz możesz wydrukować elementy listy w odwrotnej kolejności w niepotrzebnie zawiły sposób!
źródło
HeldExpressions
elementu w pakietach nie był tego świadomy. Zwykle importowałem jako ciąg, a następnie używałemToExpression
zHoldComplete
jako ostatni argument. Odnośnie używaniaCondition
dla wiadomości - jest to standardowa technika w pisaniu pakietów od co najmniej 1994 roku. Odnośnie trwałości poprzezModule
vars - jakiś czas temu miałem długi post na ten temat na Mathgroup: groups.google.com/group/comp.soft- sys.math.mathematica /… (mój trzeci post w tym wątku), jest to podobne i zawiera linki do kilku nietrywialnych przykładów użycia.Condition
jako wiedzę, prawdopodobnie od współpracownika, ale nie zdawałem sobie sprawy, że to standardowa technika. Link dotyczący używaniaModule
symboli jako typów referencyjnych jest interesujący!Drukowanie definicji symboli systemu bez dołączonego kontekstu
Poniższa
contextFreeDefinition[]
funkcja spróbuje wydrukować definicję symbolu bez dołączonego najczęściej używanego kontekstu. Definicję można następnie skopiować do Workbencha i sformatować pod kątem czytelności (wybierz ją, kliknij prawym przyciskiem myszy, Źródło -> Format)withRules []
Zastrzeżenie: Ta funkcja nie jest lokalizowanie zmiennych w ten sam sposób
With
iModule
zrobić, co oznacza, że zagnieżdżone konstrukcje lokalizacyjne nie działać będzie zgodnie z oczekiwaniami.withRules[{a -> 1, b -> 2}, With[{a=3}, b_ :> b]]
będzie zastąpića
ib
w zagnieżdżonaWith
iRule
, aWith
tego nie robi.Jest to wariant,
With
który używa reguł zamiast=
i:=
:Okazało się to przydatne podczas porządkowania kodu napisanego podczas eksperymentów i lokalizowania zmiennych. Czasami otrzymuję listy parametrów w postaci
{par1 -> 1.1, par2 -> 2.2}
. ZwithRules
parametrem wartości są łatwo wprowadzić do kodu uprzednio pisemnej za pomocą zmiennych globalnych.Użycie jest takie jak
With
:Antyaliasing grafiki 3D
Jest to bardzo prosta technika usuwania grafiki 3D, nawet jeśli twój sprzęt graficzny nie obsługuje jej natywnie.
Oto przykład:
Należy zauważyć, że duża wartość
n
lub duży rozmiar obrazu zwykle ujawniają błędy sterownika karty graficznej lub wprowadzają artefakty.Funkcja porównywania notebooków
Funkcjonalność porównywania notesów jest dostępna w
<<AuthorTools`
pakiecie i (przynajmniej w wersji 8) w nieudokumentowanymNotebookTools`
kontekście. To jest mały GUI do porównania dwóch obecnie otwartych notatników:źródło
a = 3; b = 4;
przed przykładowym wywołaniem, a następnie wywołaćwithRules
. Można zapisać go zamiast przy użyciu następujących:SetAttributes[withRules, HoldAll];withRules[rules_, expr_] := Unevaluated[expr] /. Unevaluated[rules]
. Różnice w semantyce wWith
tamtych czasach: 1. strony reguł nie są teraz oceniane 2.withRules
nie rozwiązuje konfliktów nazewnictwa z wewnętrznymi konstrukcjami określającymi zasięgWith
. Ta ostatnia jest dość poważna - w zależności od przypadku jest dobra lub zła.With
s. To nie zawsze działa również z wbudowanymi konstrukcjami lokalizacji, npWith[{a=1}, Block[{a=2}, a]]
. Czy uważasz, że jest dobry powód, dla którego zagnieżdżoneBlock
nie lokalizują się tam, tak jak zagnieżdżoneWith
iModule
tak?)Unevaluated[rules]
ponieważ chciałemx -> 1+1
ocenić RHS.With
s są łatwe do wykrycia i uniknięcia, ale wzorce nie:With[{a = 1}, a_ -> a]
lokalizuje wewnętrzne,a
awithRules
nie. Czy wiesz, czy istnieje sposób, aby uzyskać dostęp do wewnętrznego mechanizmu lokalizacji Mathematica i stworzyć nowe konstrukcje (podobne doRule
), które również lokalizują? Prawdopodobnie usunę tę odpowiedź później, ponieważ jest bardziej niebezpieczna niż użyteczna, ale najpierw chciałbym się nią pobawić.InheritedBlock
jest całkiem fajne i bardzo elegancko rozwiązuje problem. Jeśli chodzi o konflikty zakresu, zwykle powiązania dla leksykalnego określania zakresu mają miejsce w „czasie leksykalnego wiązania”, czyli - przed uruchomieniem, podczas gdy dynamiczne określanie zakresu wiąże się w czasie wykonywania, co może to wyjaśniać. Możesz to porównać z podobnym przypadkiem forModule
, który pozwala na konstruktywne użycie (patrz np. Tutaj stackoverflow.com/questions/7394113/… ). Problem w tym, żeBlock
potrzebny jest jakiś symbol, żeby ...Czyste funkcje rekurencyjne (
#0
) wydają się być jednym z ciemniejszych zakątków języka. Oto kilka nietrywialnych przykładów ich użycia, w których jest to naprawdę przydatne (co nie znaczy, że nie można ich bez tego zrobić). Poniżej znajduje się dość zwięzła i dość szybka funkcja znajdowania połączonych komponentów na wykresie, biorąc pod uwagę listę krawędzi określonych jako pary wierzchołków:To, co się tutaj dzieje, polega na tym, że najpierw odwzorowujemy symbol fikcyjny na każdym z numerów wierzchołków, a następnie ustalamy sposób, który
{f[5],f[10]}
, powiedzmy, biorąc pod uwagę parę wierzchołków ,f[5]
dałby wynikf[10]
. Rekurencyjna funkcja czysta jest używana jako kompresor ścieżki (w celu skonfigurowania zapamiętywania w taki sposób, że zamiast długich łańcuchówf[1]=f[3],f[3]=f[4],f[4]=f[2], ...
, zapamiętane wartości są korygowane za każdym razem, gdy zostanie wykryty nowy „pierwiastek” składnika. Daje to znaczne przyspieszenie. Ponieważ używamy przypisania, potrzebujemy, aby było to HoldAll, co czyni ten konstrukt jeszcze bardziej niejasnym i atrakcyjniejszym). Ta funkcja jest wynikiem dyskusji w Mathgroup on-line i off-line z udziałem Freda Simonsa, Szabolcs Horvata, DrMajorBoba i naprawdę twoich. Przykład:Z pewnością jest znacznie wolniejszy niż wbudowany, ale jak na rozmiar kodu, wciąż dość szybki IMO.
Inny przykład: oto rekurencyjna realizacja
Select
, oparta na połączonych listach i rekurencyjnych czystych funkcjach:Na przykład,
Jednak nie jest on poprawnie rekurencyjny i spowoduje wysadzenie stosu (awarię jądra) w przypadku większych list. Oto wersja rekurencyjna ogona:
Na przykład,
źródło
To jest przepis z książki Stana Wagona ... użyj go, gdy wbudowana fabuła zachowuje się nieprawidłowo z powodu braku precyzji
Często używam następującej sztuczki od Kristjana Kannike, kiedy potrzebuję zachowania "podobnego do słownika" z obniżonych wartości Mathematica
Gdy wyniki oceny są mylące, czasami pomaga zrzucić etapy oceny do pliku tekstowego
źródło
Możliwe jest uruchomienie MathKernel w trybie wsadowym przy użyciu nieudokumentowanych opcji wiersza poleceń
-batchinput
i-batchoutput
:(gdzie
input.m
jest wsadowym plikiem wejściowym kończącym się znakiem nowego wiersza,outputfile.txt
to plik, do którego zostanie przekierowany wynik).W Mathematica v.> = 6 MathKernel ma nieudokumentowaną opcję wiersza poleceń:
który kontroluje, czy MathKernel będzie miał widoczną ikonę na pasku zadań (przynajmniej pod Windows).
FrontEnd (przynajmniej od wersji 5) ma nieudokumentowaną opcję wiersza poleceń
co wyłącza ekran powitalny i pozwala na znacznie szybsze uruchomienie Mathematica FrontEnd
i opcja
co wyłącza mechanizm, który uruchamia najnowszą zainstalowaną wersję Mathematica zamiast uruchamiania wersji związanej z plikami .nb w rejestrze systemowym.
Innym sposobem na to prawdopodobnie jest :
Przydatne jest połączenie ostatniej opcji wiersza poleceń z ustawieniem globalnej opcji FrontEnd,
VersionedPreferences->True
która wyłącza dzielenie się preferencjami między różnymi zainstalowanymi wersjami Mathematica :(Powyższe należy ocenić w najnowszej zainstalowanej wersji Mathematica ).
W Mathematica 8 jest to kontrolowane w oknie dialogowym Preferencje, w panelu System, w ustawieniu „Utwórz i utrzymuj preferencje interfejsu specyficzne dla wersji” .
Możliwe jest pobranie niepełnej listy opcji wiersza poleceń FrontEnd za pomocą nieudokumentowanego klucza
-h
(kod dla Windows):daje:
Inne opcje obejmują:
Czy istnieją inne potencjalnie przydatne opcje wiersza poleceń MathKernel i FrontEnd? Udostępnij, jeśli wiesz.
Powiązane pytanie .
źródło
-32
i oznacza, że bitowość MathKernela używanego przez FrontEnd będzie pasowała do bitowości systemu operacyjnego (64-bitowego). Wydaje się, że w innych przypadkach ta opcja niczego nie zmieni.Moimi ulubionymi sztuczkami są małe makra generujące kod, które pozwalają zastąpić kilka standardowych poleceń standardowych jednym krótkim. Alternatywnie możesz utworzyć polecenia do otwierania / tworzenia notatników.
Oto, czego używam od jakiegoś czasu w moim codziennym przepływie pracy w Mathematica. Zauważyłem, że często wykonuję następujące czynności:
Robienie tego wszystkiego ręcznie jest uciążliwe, więc zautomatyzujmy! Najpierw trochę kodu użytkowego:
Teraz stwórzmy makro, które umieści następujące komórki w notatniku:
A oto makro:
Teraz, kiedy wpisuję,
MyPrivatize[]
tworzy kontekst prywatny i ładuje mój standardowy pakiet. Teraz stwórzmy polecenie, które otworzy nowy zeszyt z własnym kontekstem prywatnym (abyś mógł się tam włamać z dzikim porzuceniem bez ryzyka zepsucia definicji), ale ma dostęp do twoich obecnych kontekstów.Fajne w tym jest to, że
SelfDestruct
po uruchomieniu polecenia nie pozostawia śladu w bieżącym notatniku - co jest dobre, ponieważ w przeciwnym razie po prostu stworzyłoby bałagan.Aby uzyskać dodatkowe punkty dotyczące stylu, możesz utworzyć wyzwalacze słów kluczowych dla tych makr za pomocą
InputAutoReplacements
, ale zostawię to jako ćwiczenie dla czytelnika.źródło
PutAppend with PageWidth -> Infinity
W Mathematica użycie
PutAppend
polecenia jest najprostszym sposobem na utrzymanie uruchomionego pliku dziennika z wynikami obliczeń pośrednich. Ale używa domyślnegoPageWith->78
ustawienia podczas eksportowania wyrażeń do pliku, więc nie ma gwarancji, że każde pośrednie wyjście zajmie tylko jedną linię w dzienniku.PutAppend
sam nie ma żadnych opcji, ale śledzenie jego ocen pokazuje, że jest oparty naOpenAppend
funkcji, która maPageWith
opcję i umożliwia zmianę jej wartości domyślnej za pomocąSetOptions
polecenia:Możemy więc
PutAppend
dołączyć tylko jedną linię naraz, ustawiając:AKTUALIZACJA
W wersji 10 wprowadzono błąd (poprawiony w wersji 11.3):
SetOptions
nie wpływa już na zachowanieOpenWrite
iOpenAppend
.Sposób obejścia problemu polega na zaimplementowaniu własnej wersji programu
PutAppend
z jawnąPageWidth -> Infinity
opcją:Zwróć uwagę, że możemy również zaimplementować go za pomocą,
WriteString
jak pokazano w tej odpowiedzi, ale w tym przypadku konieczne będzie wstępne przekonwertowanie wyrażenia na odpowiednieInputForm
przezToString[expr, InputForm]
.źródło
Po prostu patrząc przez jednego z moich paczek do włączenia do tego, i znaleźć kilka wiadomości, że określone, że cuda działa:
Debug::<some name>
. Domyślnie są wyłączone, więc nie powodują dużego obciążenia. Ale mogę zaśmiecać nimi swój kod i włączać je, jeśli chcę dokładnie dowiedzieć się, jak zachowuje się fragment kodu.źródło
Debug
aniTrace
funkcją ani ; jest to zestaw wiadomości, które stworzyłem, którymi mogę zaśmiecać swój kod, aby włączać / wyłączać w dowolnym momencie. Są poprzedzone słowemDebug
, w taki sam sposób, jak komunikatusage
jest poprzedzony nazwą funkcji. Zapewnia taką samą funkcjonalność, jak umieszczanie zestawucout
instrukcji w kodzie C ++.Jedną z rzeczy, które przeszkadzają mi w przypadku wbudowanych konstrukcji określających zakres, jest to, że oceniają one wszystkie definicje zmiennych lokalnych naraz, więc nie możesz pisać na przykład
Tak więc jakiś czas temu wymyśliłem makro o nazwie WithNest, które pozwala ci to zrobić. Uważam to za przydatne, ponieważ pozwala zachować lokalne powiązania zmiennych bez konieczności wykonywania czegoś takiego
Ostatecznie najlepszym sposobem, jaki mogłem znaleźć, aby to zrobić, było użycie specjalnego symbolu, aby ułatwić powtarzanie listy powiązań, i umieściłem definicję we własnym pakiecie, aby ukryć ten symbol. Może ktoś ma prostsze rozwiązanie tego problemu?
Jeśli chcesz to wypróbować, umieść poniższe w pliku o nazwie
Scoping.m
:źródło
Ten został napisany przez Alberto Di Lullo (który nie wydaje się być na Stack Overflow).
CopyToClipboard
, dla Mathematica 7 (w Mathematica 8 jest wbudowany)Oryginalny post: http://forums.wolfram.com/mathgroup/archive/2010/Jun/msg00148.html
Zauważyłem, że ta procedura jest przydatna do kopiowania dużych liczb rzeczywistych do schowka w zwykłej postaci dziesiętnej. Na przykład
CopyToClipboard["123456789.12345"]
Cell[OutputFormData@expr]
starannie usuwa cytaty.źródło
Ten kod tworzy paletę, która przesyła zaznaczenie do Stack Exchange jako obraz. W systemie Windows dostępny jest dodatkowy przycisk, który zapewnia wierniejsze renderowanie zaznaczenia.
Skopiuj kod do komórki notesu i oceń. Następnie wyjmij paletę z wyjścia i zainstaluj ją za pomocą
Palettes -> Install Palette...
Jeśli masz z tym jakiś problem, napisz komentarz tutaj. Pobierz wersję notebooka tutaj .
źródło
Jestem pewien, że wiele osób spotkało się z sytuacją, w której uruchamiają jakieś rzeczy, zdając sobie sprawę, że nie tylko utknęli w programie, ale także nie zapisali przez ostatnie 10 minut!
EDYTOWAĆ
Po pewnym czasie cierpienia z tego powodu, pewnego dnia odkryłem, że można utworzyć automatyczne zapisywanie z poziomu kodu Mathematica . Myślę, że korzystanie z takiego automatycznego zapisywania bardzo mi pomogło w przeszłości i zawsze uważałem, że sama możliwość jest czymś, o czym niewiele osób zdaje sobie sprawę, że mogą zrobić.
Oryginalny kod, którego użyłem, znajduje się na dole. Dzięki komentarzom dowiedziałem się, że jest to problematyczne i dużo lepiej jest to zrobić w alternatywny sposób, używając
ScheduledTask
(co zadziała tylko w Mathematica 8).Kod do tego można znaleźć w tej odpowiedzi od
Sjoerd C. de Vries
(Ponieważ nie jestem pewien, czy mogę go tutaj skopiować, zostawiam go tylko jako łącze).Poniższe rozwiązanie używa
Dynamic
. Zapisuje notatnik co 60 sekund, ale najwyraźniej tylko wtedy, gdy jego komórka jest widoczna . Zostawiam to tutaj tylko z powodów ukończenia. (oraz dla użytkowników Mathematica 6 i 7)/EDYTOWAĆ
Aby go rozwiązać, używam tego kodu na początku notatnika:
Pozwoli to zaoszczędzić Twoją pracę co 60 sekund.
Wolę to robić,
NotebookAutoSave[]
ponieważ zapisuje przed przetworzeniem danych wejściowych i ponieważ niektóre pliki zawierają więcej tekstu niż danych wejściowych.Pierwotnie znalazłem to tutaj: http://en.wikipedia.org/wiki/Talk:Mathematica#Criticisms
Zwróć uwagę, że po uruchomieniu tej linii zapisywanie nastąpi nawet po zamknięciu i ponownym otwarciu pliku (o ile włączone jest dynamiczne aktualizowanie).
Ponadto, ponieważ w Mathematica nie ma możliwości cofnięcia , uważaj, aby nie usunąć całej zawartości, ponieważ zapisanie spowoduje, że będzie ona nieodwracalna (na wszelki wypadek usuwam ten kod z każdego gotowego notatnika)
źródło
NotebookSave[SelectedNotebook[], "work-" <> IntegerString[i] <> ".nb"]; i++
, ale myślę, że każde odwołanie do aktualnej nazwy notatnika stanie się rekurencyjne.Dynamic
obiekty odświeżają się tylko wtedy, gdy są widoczne, więc nie byłbym pewien, czy ta metoda zadziała, jeśli np. PrzewinieszDynamic
obiekt poza widoczny obszar. Z drugiej strony, nie próbowałem. W każdym razie zaproponowałem to tylko jako sugestię.Dynamic[Refresh[i++, UpdateInterval -> 1, TrackedSymbols -> {}]]
. Przewiń rosnącą liczbę z pola widzenia, poczekaj minutę, przewiń do tyłu i zobacz, że liczba nie jest zwiększana o 60. InformacjeUpdateInterval
: jest to zwykle używane, jeśli to możliwe, ale jeśli kod zawiera zmienne, które się zmieniają, ta zmiana wyzwala nowe odświeżanie przed interwał się kończy. Wypróbuj powyższą linię bezTrackedSymbols
Pamiętaj, że Księga Mathematica jest również dostępna online pod adresem http://reference.wolfram.com/legacy/v5_2/ - chociaż jest ona zastępowana przez aktualną dokumentację pod adresem http://reference.wolfram.com
źródło
Uważam, że przy tworzeniu pakietów bardzo przydatne jest dodanie tego skrótu klawiaturowego do mojego
SystemFiles/FrontEnd/TextResources/Windows/KeyEventTranslations.tr
pliku.Następnie za każdym razem
Packagename.m
robięPackagenameTest.nb
notatnik do testów i pierwsze 2 komórki testowego notatnika są ustawiane jako komórki inicjalizacyjne. W pierwszej celi umieściłemaby załadować bardzo przydatną bibliotekę PackageManipulations napisaną przez Leonida. Druga komórka zawiera
które wszystkie dokonują właściwego przeładowania pakietu. Zwróć uwagę, że pierwsze dwie linie są dostępne tylko dla
Remove
wszystkich symboli, ponieważ lubię, aby konteksty były jak najczystsze.Następnie przepływ pracy przy pisaniu i testowaniu pakietu wygląda mniej więcej tak.
Packagename.m
.PackagenameTest.nb
i zróbCTRL + ALT + i
.Powoduje to ponowne załadowanie pakietu przez komórki inicjalizacyjne, co sprawia, że testowanie jest naprawdę proste.
źródło
Poniższa funkcja
format[expr_]
może służyć do tworzenia wcięć / formatowania niesformatowanychmathematica
wyrażeń, które obejmują całą stronęref: /codegolf/3088/indent-a-string-using-given-parentheses
źródło
format@RandomInteger[10,{3,3}]
): pastebin.com/nUT54Emq Skoro masz już podstawy i jesteś tym zainteresowany, czy możesz ulepszyć kod tak, aby stworzyć użyteczne, czytelne formatowanie? Następnie następnym krokiem byłoby utworzenie przycisku wklejania, który utworzy komórkę wejściową z ładnie wciętym kodem Mathematica (najlepiej z zachowaniem komentarzy !!). Zobacz także moje powiązane pytanie .