Kita semua tahu bahwa Mathematica hebat, tetapi juga sering tidak memiliki fungsi kritis. Paket / alat / sumber daya eksternal apa yang Anda gunakan dengan Mathematica?
Saya akan mengedit (dan mengundang orang lain untuk melakukannya juga) posting utama ini untuk memasukkan sumber daya yang berfokus pada penerapan umum dalam penelitian ilmiah dan yang mungkin berguna bagi banyak orang. Jangan ragu untuk menyumbang apa pun, bahkan cuplikan kode kecil (seperti yang saya lakukan di bawah ini untuk rutinitas waktu).
Juga, fitur tidak berdokumen dan berguna di Mathematica 7 dan di luar Anda menemukan diri Anda, atau menggali dari beberapa kertas / situs dipersilahkan.
Harap sertakan deskripsi atau komentar singkat tentang mengapa sesuatu itu hebat atau utilitas apa yang disediakannya. Jika Anda menautkan ke buku-buku di Amazon dengan tautan afiliasi, harap sebutkan, misalnya, dengan meletakkan nama Anda setelah tautan.
Paket:
LevelScheme
adalah paket yang sangat memperluas kemampuan Mathematica untuk menghasilkan plot yang terlihat bagus. Saya menggunakannya jika bukan untuk hal lain maka untuk kontrol, jauh lebih baik atas bingkai / kutu kapak. Versi terbarunya disebut SciDraw, dan akan dirilis sekitar tahun ini.- David Park's
Presentation Package
(US $ 50 - tidak ada biaya untuk pembaruan) - Paket Jeremy Michelson
grassmannOps
menyediakan sumber daya untuk melakukan aljabar dan kalkulus dengan variabel dan operator Grassmann yang memiliki hubungan pergantian non trivial. GrassmannAlgebra
Paket dan buku John Brown untuk bekerja dengan aljabar Grassmann dan Clifford.- RISC (Research Institute for Symbolic Computation) memiliki beragam paket untuk Mathematica (dan bahasa lain) yang tersedia untuk diunduh. Secara khusus, ada Teorema untuk pembuktian teorema otomatis, dan banyak paket untuk penjumlahan simbolik, persamaan perbedaan, dll . Di halaman perangkat lunak kelompok Algorithmic Combinatorics group .
Alat:
MASH
adalah skrip Perl yang sangat bagus dari Daniel Reeves yang pada dasarnya menyediakan dukungan scripting untuk Mathematica v7. (Sekarang dibangun pada Mathematica 8 dengan-script
opsi.)- Sebuah
alternate Mathematica shell
dengan input readline GNU (menggunakan python, * nix saja) - Paket ColourMaths memungkinkan Anda memilih bagian ekspresi secara visual dan memanipulasinya. http://www.dbaileyconsultancy.co.uk/colour_maths/colour_maths.html
Sumber:
Repositori Wolfram sendiri
MathSource
memiliki banyak notebook yang berguna jika sempit untuk berbagai aplikasi. Periksa juga bagian lain sepertiCurrent Documentation
,Courseware
untuk kuliah,- dan
Demos
untuk, yah, demo.
The Mathematica Wikibook .
Buku:
- Pemrograman Mathematica: pengantar tingkat lanjut oleh Leonid Shifrin (
web
,pdf
) adalah harus dibaca jika Anda ingin melakukan apa pun lebih dari Untuk loop di Mathematica. Kami merasa senang memilikiLeonid
dirinya sendiri menjawab pertanyaan di sini. - Metode Quantum dengan Mathematica oleh James F. Feagin ( amazon )
- Buku The Mathematica oleh Stephen Wolfram ( amazon ) (
web
) - Garis Besar Schaum ( amazon )
- Mathematica in Action oleh Stan Wagon ( amazon ) - 600 halaman contoh rapi dan naik ke Mathematica versi 7. Teknik visualisasi sangat baik, Anda dapat melihat beberapa di antaranya ada di penulis
Demonstrations Page
. - Dasar-Dasar Pemrograman Mathematica oleh Richard Gaylord (
pdf
) - Pengantar singkat yang bagus untuk sebagian besar dari apa yang perlu Anda ketahui tentang pemrograman Mathematica. - Cookbook Mathematica oleh Sal Mangano diterbitkan oleh O'Reilly 2010 832 halaman. - Ditulis dengan gaya O'Reilly Cookbook yang terkenal: Masalah - Solusi. Untuk perantara.
- Persamaan Diferensial dengan Mathematica, 3rd Ed. Elsevier 2004 Amsterdam oleh Martha L. Abell, James P. Braselton - 893 halaman Untuk pemula, belajar memecahkan DE dan Mathematica secara bersamaan.
Fitur tidak berdokumen (atau jarang didokumentasikan):
- Bagaimana cara menyesuaikan pintasan keyboard Mathematica. Lihat
this question
. - Cara memeriksa pola dan fungsi yang digunakan oleh fungsi Mathematica sendiri. Lihat
this answer
- Bagaimana cara mencapai ukuran yang konsisten untuk GraphPlots di Mathematica? Lihat
this question
. - Cara membuat dokumen dan presentasi dengan Mathematica. Lihat
this question
.
sumber
Grid
, atau apa pun yang seperti itu.Jawaban:
Saya telah menyebutkan ini sebelumnya, tetapi alat yang saya temukan paling berguna adalah aplikasi
Reap
danSow
yang meniru / memperluas perilakuGatherBy
:Ini memungkinkan saya untuk mengelompokkan daftar berdasarkan kriteria apa pun dan mengubahnya dalam proses. Cara kerjanya adalah bahwa fungsi kriteria (
f
) menandai setiap item dalam daftar, setiap item kemudian diubah oleh fungsi yang disediakan kedua (g
), dan output spesifik dikontrol oleh fungsi ketiga (h
). Fungsih
menerima dua argumen: tag dan daftar item yang dikumpulkan yang memiliki tag itu. Item mempertahankan pesanan aslinya, jadi jika Anda mengaturh = #1&
maka Anda mendapatkan yang tidak disortirUnion
, seperti dalam contoh untukReap
. Tapi, itu bisa digunakan untuk pemrosesan sekunder.Sebagai contoh utilitasnya, saya telah bekerja dengan Wannier90 yang menampilkan Hamiltonian yang bergantung secara spasial ke dalam file di mana setiap baris adalah elemen yang berbeda dalam matriks, sebagai berikut
Untuk mengubah daftar itu menjadi seperangkat matriks, saya mengumpulkan semua sublists yang berisi koordinat yang sama, mengubah informasi elemen menjadi aturan (yaitu {i, j} -> Re [Hij] + I Im [Hij]), dan kemudian mengubah aturan yang terkumpul menjadi
SparseArray
semua dengan liner satu:Jujur, ini adalah Pisau Tentara Swiss saya, dan itu membuat hal-hal rumit sangat sederhana. Sebagian besar alat saya yang lain agak spesifik domain, jadi saya mungkin tidak akan mempostingnya. Namun, sebagian besar, jika tidak semua, referensi dari mereka
SelectEquivalents
.Sunting : ini tidak sepenuhnya meniru
GatherBy
bahwa ia tidak dapat mengelompokkan beberapa level ekspresi sesederhana yangGatherBy
bisa. Namun,Map
berfungsi dengan baik untuk sebagian besar yang saya butuhkan.Contoh : @Yaroslav Bulatov telah meminta contoh yang lengkap. Ini satu dari penelitian saya yang sangat disederhanakan. Jadi, katakanlah kita memiliki satu set poin di pesawat
dan kami ingin mengurangi jumlah poin dengan serangkaian operasi simetri. (Untuk yang penasaran, kami menghasilkan grup kecil dari setiap titik.) Untuk contoh ini, mari kita gunakan sumbu rotasi empat kali lipat tentang sumbu z
Menggunakan
SelectEquivalents
kami dapat mengelompokkan poin yang menghasilkan set gambar yang sama di bawah operasi ini, yaitu mereka setara, menggunakan berikut iniyang menghasilkan 3 sublists yang berisi poin yang setara. (Catatan,
Union
sangat penting di sini karena memastikan bahwa gambar yang sama dihasilkan oleh setiap titik. Awalnya, saya menggunakanSort
, tetapi jika suatu titik terletak pada sumbu simetri, itu tidak berubah di bawah rotasi tentang sumbu yang memberikan gambar ekstra dari dirinya sendiri. Jadi,Union
hilangkan gambar-gambar ekstra ini. Juga,GatherBy
akan menghasilkan hasil yang sama.) Dalam hal ini, poin sudah dalam bentuk yang akan saya gunakan, tetapi saya hanya perlu titik perwakilan dari setiap pengelompokan dan saya ingin menghitung dari poin yang setara. Karena, saya tidak perlu mengubah setiap titik, saya menggunakanIdentity
berfungsi di posisi kedua. Untuk fungsi ketiga, kita harus berhati-hati. Argumen pertama yang diteruskan adalah gambar dari titik-titik di bawah rotasi yang untuk titik tersebut{0,0,0}
adalah daftar empat elemen yang identik, dan menggunakannya akan membuang hitungan. Namun, argumen kedua hanyalah daftar semua elemen yang memiliki tag itu, jadi hanya akan berisi{0,0,0}
. Dalam kode,Perhatikan, langkah terakhir ini bisa dengan mudah dilakukan
Tapi, mudah dengan ini dan contoh yang kurang lengkap di atas untuk melihat bagaimana transformasi yang sangat kompleks dimungkinkan dengan kode minimum.
sumber
Fortran
pernah saya lihat. Membuat saya hampir mempertimbangkan untuk menggunakanFortran
...Salah satu hal yang menyenangkan tentang antarmuka notebook Mathematica adalah dapat mengevaluasi ekspresi dalam bahasa apa pun , bukan hanya Mathematica. Sebagai contoh sederhana, pertimbangkan untuk membuat tipe sel input Shell baru yang meneruskan ekspresi yang terkandung ke shell sistem operasi untuk evaluasi.
Pertama, tentukan fungsi yang mendelegasikan evaluasi perintah teks ke shell eksternal:
Argumen kedua diperlukan dan diabaikan karena alasan yang akan muncul kemudian. Selanjutnya, kami ingin membuat gaya baru yang disebut Shell :
Shell
.Gunakan ekspresi sel berikut sebagai Langkah 6 Teks :
Sebagian besar ungkapan ini disalin secara langsung dari gaya Program bawaan. Perubahan utama adalah baris-baris ini:
Evaluatable
mengaktifkan fungsionalitas SHIFT + ENTER untuk sel. Evaluasi akan memanggilCellEvaluationFunction
lewat konten sel dan jenis konten sebagai argumen (shellEvaluate
mengabaikan argumen yang terakhir).CellFrameLabels
hanyalah keramahtamahan yang memungkinkan pengguna mengidentifikasi bahwa sel ini tidak biasa.Dengan semua ini di tempat, sekarang kita dapat memasukkan dan mengevaluasi ekspresi shell:
Yang terbaik adalah menjaga gaya yang didefinisikan ini dalam stylesheet yang berlokasi di pusat. Selain itu, fungsi evaluasi seperti
shellEvaluate
yang terbaik didefinisikan sebagai bertopik menggunakan DeclarePackage diinit.m
. Rincian kedua kegiatan ini berada di luar cakupan respons ini.Dengan fungsi ini, seseorang dapat membuat buku catatan yang berisi ekspresi input dalam setiap sintaks yang menarik. Fungsi evaluasi dapat ditulis dalam Mathematica murni, atau mendelegasikan setiap atau semua bagian evaluasi ke lembaga eksternal. Sadarilah bahwa ada kaitan lain yang terkait dengan evaluasi sel, seperti
CellEpilog
,CellProlog
danCellDynamicExpression
.Pola umum melibatkan penulisan teks ekspresi input ke file sementara, kompilasi file dalam beberapa bahasa, menjalankan program dan menangkap output untuk tampilan utama di sel output. Ada banyak detail yang harus diatasi ketika menerapkan solusi penuh seperti ini (seperti menangkap pesan kesalahan dengan benar), tetapi orang harus menghargai kenyataan bahwa tidak hanya mungkin untuk melakukan hal-hal seperti ini, tetapi juga praktis.
Pada catatan pribadi, fitur-fitur seperti inilah yang menjadikan antarmuka notebook sebagai pusat dari dunia pemrograman saya.
Memperbarui
Fungsi pembantu berikut berguna untuk membuat sel-sel seperti:
Digunakan demikian:
Sekarang, jika
shellCell[]
dievaluasi, sel input akan dihapus dan diganti dengan sel input baru yang mengevaluasi isinya sebagai perintah shell.sumber
CellEvaluationFunction
dapat digunakan untuk hacking sintaks tingkat rendah juga saya pikir.CellEvaluationFunction
kail yang Anda cari?Cell
opsi lain yang terkait dengan evaluasi sel -Evaluator -> "EvaluatorName"
. Arti dari"EvaluatorName"
dapat dikonfigurasi melalui dialog Evaluasi :: Opsi Konfigurasi Kernel .... Saya masih tidak tahu apakah mungkin untuk mengkonfigurasi secara terprogram ... Teknik ini memungkinkan untuk menggunakan MathKernels yang berbedaCell
dalam s yang berbeda dalam satu Notebook. MathKernels ini dapat berasal dari berbagai versi Mathematica yang diinstal.Import
, atau mungkin memulai proses Python eksternal dan berkomunikasi melalui alirannya (misalnya menggunakan Java ProcessBuilder ). Saya yakin ada cara Mathematica yang lebih baik - terdengar seperti pertanyaan SO yang bagus :)Todd Gayley (Penelitian Wolfram) baru saja mengirim saya hack bagus yang memungkinkan untuk "membungkus" fungsi bawaan dengan kode arbitrer. Saya merasa bahwa saya harus membagikan instrumen yang bermanfaat ini. Berikut ini adalah jawaban Todd pada saya
question
.sumber
Unprotect
memang harus, hanya ditinggalkan. TitikBlock
(pelingkupan dinamis) dan$inMsg
tepat untuk mencegah rekursi tak terbatas. Karena$inMsg
tidak ditentukan di luar (ini merupakan persyaratan penting), pada awalnya,TrueQ
mengevaluasi keFalse
, dan kami memasuki tubuh fungsi. Tetapi ketika kita memiliki pemanggilan fungsi di dalam tubuh, kondisi mengevaluasi keFalse
(karena variabel telah didefinisikan ulang oleh Blok). Dengan demikian, aturan yang ditentukan pengguna tidak cocok, dan aturan bawaan malah digunakan.DownValues
saat berjalan, Anda dapat melihat posting ini groups.google.com/group/comp.soft-sys.math.mathematica/… , untuk contoh (SetDelayed
redefinisi) . Tetapi metode saya kurang elegan, kurang kuat, lebih rentan kesalahan, dan membuat istirahat dari rekursi menjadi kurang sepele untuk diterapkan. Jadi, dalam kebanyakan situasi, metode yang dijelaskan oleh @Alexey menang dengan mudah.Ini bukan sumber yang lengkap, jadi saya melemparkannya ke sini di bagian jawaban, tapi saya merasa sangat berguna ketika mencari tahu masalah kecepatan (yang, sayangnya, merupakan bagian besar dari apa pemrograman tentang Mathematica adalah tentang).
Penggunaannya sederhana saja
timeAvg@funcYouWantToTest
.EDIT: Mr. Wizard telah menyediakan versi yang lebih sederhana yang menghilangkan
Throw
danCatch
dan sedikit lebih mudah untuk diuraikan:EDIT: Ini versi dari acl (diambil dari sini ):
sumber
Catch
danThrow
seharusnya digunakan dengan tag pengecualian unik.Throw
danCatch
" daripada "Reap
danSow
."RepeatedTiming
untuk melakukan ini.Internal`InheritedBlock
Baru-baru ini saya mempelajari keberadaan fungsi yang bermanfaat seperti
Internal`InheritedBlock
, dari pesan Daniel Lichtblau ini di newsgroup resmi.Seperti yang saya mengerti,
Internal`InheritedBlock
memungkinkan untuk meneruskan salinan fungsi keluar di dalamBlock
ruang lingkup:Saya pikir fungsi ini bisa sangat berguna bagi semua orang yang perlu memodifikasi fungsi bawaan untuk sementara!
Perbandingan dengan Block
Mari kita mendefinisikan beberapa fungsi:
Sekarang kami ingin meneruskan salinan fungsi ini ke dalam
Block
ruang lingkup. Pengadilan naif tidak memberikan apa yang kita inginkan:Sekarang mencoba menggunakan definisi yang tertunda dalam argumen pertama
Block
(ini adalah fitur yang tidak berdokumen juga):Kami melihat bahwa dalam kasus ini
a
berfungsi tetapi kami belum mendapatkan salinan bagiana
dalamBlock
lingkup yang asli.Sekarang mari kita coba
Internal`InheritedBlock
:Kami telah mendapatkan salinan definisi asli untuk
a
bagian dalamBlock
lingkup dan kami dapat memodifikasinya dengan cara yang kami inginkan tanpa memengaruhi definisi global untuka
!sumber
Mathematica adalah alat yang tajam, tetapi dapat memotong Anda dengan perilaku yang agak tidak diketik dan longsoran pesan diagnostik samar . Salah satu cara untuk mengatasinya adalah dengan mendefinisikan fungsi yang mengikuti idiom ini:
Itu banyak boilerplate, yang saya sering tergoda untuk melewatinya. Terutama ketika membuat prototipe, yang banyak terjadi di Mathematica. Jadi, saya menggunakan makro yang disebut
define
yang memungkinkan saya untuk tetap disiplin, dengan boilerplate yang lebih sedikit.Penggunaan dasar
define
adalah seperti ini:Pada awalnya tidak terlihat banyak, tetapi ada beberapa manfaat tersembunyi. Layanan pertama yang
define
menyediakan adalah bahwa ia secara otomatis berlakuClearAll
untuk simbol yang didefinisikan. Ini memastikan bahwa tidak ada definisi sisa - suatu kejadian umum selama pengembangan awal suatu fungsi.Layanan kedua adalah bahwa fungsi yang didefinisikan secara otomatis "ditutup". Maksud saya, fungsi ini akan mengeluarkan pesan dan batalkan jika dipanggil dengan daftar argumen yang tidak cocok dengan salah satu definisi:
Ini adalah nilai utama dari
define
, yang menangkap kelas kesalahan yang sangat umum.Kenyamanan lain adalah cara ringkas untuk menentukan atribut pada fungsi yang sedang didefinisikan. Mari kita buat fungsinya
Listable
:Selain semua atribut normal,
define
menerima atribut tambahan yang disebutOpen
. Ini mencegahdefine
dari menambahkan definisi kesalahan catch-all ke fungsi:Beberapa atribut dapat didefinisikan untuk suatu fungsi:
Tanpa basa-basi lagi, berikut adalah definisi
define
:Implementasi yang dipamerkan mendukung tidak up-nilai atau currying, atau pola yang lebih umum daripada definisi fungsi sederhana. Namun tetap bermanfaat.
sumber
Mulai tanpa buku catatan kosong terbuka
Saya merasa terganggu dengan memiliki Mathematica mulai dengan buku catatan kosong terbuka. Saya bisa menutup buku catatan ini dengan sebuah skrip, tetapi masih akan terbuka sebentar. Retasan saya adalah membuat file yang
Invisible.nb
berisi:Dan tambahkan ini ke
Kernel\init.m
:Saya sekarang memulai Mathematica dengan membuka
Invisible.nb
Mungkin ada cara yang lebih baik, tetapi ini telah membantu saya dengan baik.
Disesuaikan
Fold
danFoldList
Fold[f, x]
dibuat setara denganFold[f, First@x, Rest@x]
Kebetulan, saya percaya ini dapat menemukan jalan ke versi Mathematica di masa depan.Mengherankan! Ini telah diterapkan, meskipun saat ini tidak berdokumen. Saya diberitahu bahwa itu diterapkan pada 2011 oleh Oliver Ruebenkoenig, tampaknya tidak lama setelah saya memposting ini. Oliver Ruebenkoenig terima kasih!
Diperbarui untuk memungkinkan ini:
"Partisi Dinamis"
Lihat posting Mathematica.SE # 7512 untuk versi baru dari fungsi ini.
Seringkali saya ingin mempartisi daftar sesuai dengan urutan panjangnya.
contoh pseudo-code:
partition[{1,2,3,4,5,6}, {2,3,1}]
Keluaran:
{{1,2}, {3,4,5}, {6}}
Saya datang dengan ini:
Yang kemudian saya selesaikan dengan ini, termasuk pengujian argumen:
Argumen ketiga mengontrol apa yang terjadi pada elemen di luar spesifikasi split.
Trik Mathematica dari Szabolcs
Yang paling sering saya gunakan adalah Paste Tabular Data Palette
Ubah data eksternal dari dalam
Compile
Baru-baru ini Daniel Lichtblau menunjukkan metode ini yang belum pernah saya lihat sebelumnya. Menurut pendapat saya itu secara signifikan memperluas utilitas
Compile
sumber
Compile
- seluruh posting saya di sini: stackoverflow.com/questions/5246330/… , adalah untuk menunjukkan kemungkinan ini dalam pengaturan non-sepele (Ada solusi yang lebih pendek dan lebih cepat untuk masalah yang dimaksud yang sudah diposting di sana) . IMO, kemenangan terbesar di sini adalah kemampuan untuk meniru pass-by-reference dan memecah fungsi yang dikompilasi menjadi potongan yang lebih mudah dikelola dan digunakan kembali.Masalah umum dan solusi ekspor PDF / EMF
1) Ini benar-benar tidak terduga dan tidak berdokumen, tetapi Mathematica mengekspor dan menyimpan gambar dalam format PDF dan EPS menggunakan sekumpulan definisi gaya yang berbeda dari yang digunakan untuk menampilkan Notebook di layar. Secara default, Notebook ditampilkan di layar dalam lingkungan gaya "Bekerja" (yang merupakan nilai default untuk opsi
ScreenStyleEvironment
global$FrontEnd
) tetapi dicetak dalam"Printout"
lingkungan gaya (yang merupakan nilai default untuk opsiPrintingStyleEnvironment
global$FrontEnd
). Ketika seseorang mengekspor grafik dalam format raster seperti GIF dan PNG atau dalam format EMF Mathematica menghasilkan grafik yang terlihat persis seperti yang terlihat di dalam Notebook. Tampaknya itu"Working"
lingkungan gaya digunakan untuk rendering dalam kasus ini. Tetapi tidak demikian halnya ketika Anda mengekspor / menyimpan apa pun dalam format PDF atau EPS! Dalam hal ini"Printout"
lingkungan gaya digunakan secara default yang sangat berbeda dari lingkungan gaya "Bekerja". Pertama-tama, yang"Printout"
gaya lingkungan setMagnification
ke 80% . Kedua, ia menggunakan nilainya sendiri untuk ukuran font dari gaya yang berbeda dan ini menghasilkan perubahan ukuran font yang tidak konsisten dalam file PDF genarated dibandingkan dengan representasi di layar asli. Yang terakhir dapat disebut fluktuasi FontSize yang sangat menjengkelkan. Tapi dengan senang hati ini bisa dihindari dengan menetapkan opsiPrintingStyleEnvironment
global$FrontEnd
untuk "Bekerja" :2) Masalah umum dengan mengekspor ke format EMF adalah bahwa sebagian besar program (tidak hanya Mathematica ) menghasilkan file yang terlihat bagus pada ukuran default tetapi menjadi jelek ketika Anda memperbesarnya. Itu karena metafil disampel pada kesetiaan resolusi layar . Kualitas file EMF yang dihasilkan dapat ditingkatkan dengan
Magnify
memasukkan objek grafis asli sehingga ketepatan pengambilan sampel gambar asli menjadi jauh lebih tepat. Bandingkan dua file:Jika Anda memasukkan file-file ini ke Microsoft Word dan memperbesarnya, Anda akan melihat bahwa "a" pertama memiliki gigi gergaji di atasnya sementara yang kedua belum (diuji dengan Mathematica 6).
Cara lain
ImageResolution
disarankan oleh Chris Degnen (opsi ini memiliki efek setidaknya mulai dari Mathematica 8):3) Dalam Mathematica kami memiliki tiga cara untuk mengubah grafik menjadi metafile: via
Export
to"EMF"
(cara sangat disarankan: menghasilkan metafile dengan kualitas setinggi mungkin), melaluiSave selection As...
item menu ( menghasilkan angka yang jauh lebih kecil , tidak direkomendasikan) dan melaluiEdit ► Copy As ► Metafile
item menu ( saya sangat merekomendasikan terhadap rute ini ).sumber
Dengan permintaan yang populer, kode untuk menghasilkan plot penjawab SO 10 teratas (kecuali anotasi ) menggunakan API SO .
sumber
Ekspresi caching
Saya menemukan fungsi-fungsi ini sangat membantu untuk cache ekspresi apa pun. Hal yang menarik di sini untuk dua fungsi ini adalah bahwa ekspresi yang ditahan itu sendiri digunakan sebagai kunci dari hashtable / simbol Cache atau CacheIndex, dibandingkan dengan memoisasi terkenal di Mathematica di mana Anda hanya dapat men-cache hasil jika fungsi didefinisikan seperti f [x_]: = f [x] = ... Jadi Anda dapat melakukan cache bagian dari suatu kode, ini berguna jika suatu fungsi dipanggil beberapa kali tetapi hanya beberapa bagian dari kode tidak boleh dihitung ulang.
Untuk menyimpan ekspresi secara terpisah dari argumennya.
Kedua kalinya ekspresi mengembalikan 6 tanpa menunggu.
Untuk cache ekspresi menggunakan ekspresi alias yang bisa bergantung pada argumen dari ekspresi yang di-cache.
Jika expr membutuhkan waktu untuk menghitung, itu jauh lebih cepat untuk mengevaluasi {"f", 2} misalnya untuk mengambil hasil yang di-cache.
Untuk variasi fungsi-fungsi ini agar memiliki cache yang dilokalkan (mis. Memori cache secara otomatis dirilis di luar Blok konstruksi) lihat posting ini Hindari panggilan berulang ke Interpolasi
Menghapus nilai yang di-cache
Untuk menghapus nilai yang di-cache ketika Anda tidak tahu jumlah definisi dari suatu fungsi. Saya menganggap bahwa definisi memiliki Blank di suatu tempat dalam argumen mereka.
Untuk menghapus nilai yang di-cache ketika Anda mengetahui jumlah definisi suatu fungsi (berjalan sedikit lebih cepat).
Ini menggunakan fakta bahwa definisi fungsi ada di akhir daftar DownValues mereka, nilai-nilai yang di-cache sebelumnya.
Menggunakan simbol untuk menyimpan data dan fungsi seperti objek
Juga di sini ada fungsi menarik untuk menggunakan simbol seperti objek.
Sudah diketahui umum bahwa Anda dapat menyimpan data dalam simbol dan mengaksesnya dengan cepat menggunakan DownValues
Anda dapat mengakses daftar kunci (atau properti) dari simbol menggunakan fungsi-fungsi ini berdasarkan pada apa yang diserahkan oleh kiriman dalam posting di situs ini:
Saya menggunakan fungsi ini banyak untuk menampilkan semua info yang terkandung dalam DownValues simbol:
Akhirnya di sini adalah cara sederhana untuk membuat simbol yang berperilaku seperti objek dalam pemrograman berorientasi objek (itu hanya mereproduksi perilaku paling dasar dari OOP tetapi saya menemukan sintaks yang elegan):
Properti disimpan sebagai DownValues dan metode sebagai tertunda Upvalues di simbol yang dibuat oleh Module yang dikembalikan. Saya menemukan sintaks untuk function2 yang merupakan sintaksis OO biasa untuk fungsi dalam struktur data Tree di Mathematica .
Untuk daftar jenis nilai yang sudah dimiliki setiap simbol, lihat http://reference.wolfram.com/mathematica/tutorial/PatternsAndTransformationRules.html dan http://www.verbeia.com/mathematica/tips/HTMLLinks/Tricks_Misc_4.html .
Misalnya coba ini
Anda dapat melangkah lebih jauh jika Anda ingin meniru objek warisan menggunakan paket yang disebut InheritRules yang tersedia di sini http://library.wolfram.com/infocenter/MathSource/671/
Anda juga bisa menyimpan definisi fungsi bukan di newObject tetapi dalam simbol tipe, jadi jika NewObject kembali ketik [newObject] bukan newObject Anda bisa mendefinisikan fungsi dan function2 seperti ini di luar NewObject (dan bukan di dalam) dan memiliki penggunaan yang sama seperti sebelumnya .
Gunakan UpValues [type] untuk melihat bahwa fungsi dan function2 didefinisikan dalam simbol tipe.
Gagasan lebih lanjut tentang sintaks terakhir ini diperkenalkan di sini https://mathematica.stackexchange.com/a/999/66 .
Versi SelectEquivalents yang ditingkatkan
@ Arcollyer: Terima kasih banyak telah membawa SelectEquivalents ke permukaan, ini adalah fungsi yang luar biasa. Ini adalah versi SelectEquivalents yang disempurnakan yang tercantum di atas dengan lebih banyak kemungkinan dan menggunakan opsi, ini membuatnya lebih mudah untuk digunakan.
Berikut adalah contoh bagaimana versi ini dapat digunakan:
Menggunakan Mathematica Kumpulkan / Kumpulkan dengan benar
Bagaimana Anda melakukan fungsi PivotTable di Mathematica?
Algoritma 2D binning cepat matematika
Internal`Bag
Daniel Lichtblau menjelaskan di sini struktur data internal yang menarik untuk daftar yang berkembang.
Menerapkan Quadtree di Mathematica
Fungsi debugging
Dua pos ini menunjuk ke fungsi yang berguna untuk debugging:
Bagaimana cara debug ketika menulis kode kecil atau besar menggunakan Mathematica? meja kerja? mma debugger? atau sesuatu yang lain? (ShowIt)
/programming/5459735/the-clearest-way-to-represent-mathematicas-evaluation- berikutnyaence /5527117#5527117 (TraceView)
Berikut fungsi lain yang didasarkan pada Menuai dan Tabur untuk mengekstrak ekspresi dari berbagai bagian program dan menyimpannya dalam simbol.
Ini sebuah contoh
Sumber daya lainnya
Berikut daftar tautan menarik untuk tujuan belajar:
Kumpulan sumber belajar Mathematica
Diperbarui di sini: https://mathematica.stackexchange.com/a/259/66
sumber
f[x_] := f[x] = some code
memoisasi standar .c:Cache[expr_] := c = expr
.SelectEquivalents
. Saya pikir, saya akan tetapTagOnElement
sebagai default kedua defaultIdentity
karena ini adalah yang paling sering digunakan. Saya tidak berpikir saya akan memasukkanFinalOp
, juga, karena dapat ditangani di dalamOpOnTaggedElems
. Saya juga mempersingkat nama-nama opsi, karena panjangnya terasa canggung untuk mengetik. CobaTagFunction
,TransformElement
,TransformResults
, danTagPattern
sebagai gantinya. Keduanya,TagPattern
danMapLevel
merupakan tambahan yang bagus untuk fungsi, dan penulisan ulang yang baik, secara keseluruhan.Fungsi utilitas saya (saya memiliki ini bawaan untuk MASH, yang disebutkan dalam pertanyaan):
sumber
Satu trik yang saya gunakan, yang memungkinkan Anda untuk meniru cara sebagian besar fungsi bawaan bekerja dengan argumen buruk (dengan mengirim pesan dan kemudian mengembalikan seluruh bentuk tidak dievaluasi) mengeksploitasi kekhasan cara
Condition
bekerja ketika digunakan dalam definisi. Jikafoo
hanya bekerja dengan satu argumen:Jika Anda memiliki kebutuhan yang lebih kompleks, mudah untuk memperhitungkan validasi argumen dan pembuatan pesan sebagai fungsi independen. Anda dapat melakukan lebih banyak hal rumit dengan menggunakan efek samping di
Condition
luar hanya menghasilkan pesan, tetapi menurut saya sebagian besar dari mereka termasuk dalam kategori "peretasan busuk" dan harus dihindari jika mungkin.Juga, dalam kategori "metaprogramming", jika Anda memiliki file paket Mathematica (
.m
), Anda bisa menggunakan"HeldExpressions"
elemen untuk mendapatkan semua ekspresi dalam file yang dibungkusHoldComplete
. Ini membuat pelacakan hal-hal menjadi lebih mudah daripada menggunakan pencarian berbasis teks. Sayangnya, tidak ada cara mudah untuk melakukan hal yang sama dengan notebook, tetapi Anda bisa mendapatkan semua ekspresi input menggunakan sesuatu seperti berikut:Terakhir, Anda dapat menggunakan fakta yang
Module
mengemulasi penutupan leksikal untuk membuat setara dengan jenis referensi. Berikut tumpukan sederhana (yang menggunakan variasiCondition
trik penanganan kesalahan sebagai bonus):Sekarang Anda dapat mencetak elemen daftar dalam urutan terbalik dengan cara yang tidak perlu berbelit-belit!
sumber
HeldExpressions
elemen dalam paket, tidak menyadarinya. Saya biasanya mengimpor sebagai string dan kemudian menggunakanToExpression
denganHoldComplete
sebagai arg terakhir. Mengenai menggunakanCondition
untuk pesan - ini telah menjadi teknik standar dalam penulisan paket setidaknya sejak tahun 1994. Mengenai kegigihan melaluiModule
vars - Saya telah memiliki posting panjang tentang itu di Mathgroup beberapa waktu lalu: groups.google.com/group/comp.soft- sys.math.mathematica / ... (posting ketiga saya di utas itu), ini sejalan dan memiliki tautan ke beberapa contoh penggunaan nontrivial.Condition
sebagai pengetahuan, mungkin dari rekan kerja, tetapi tidak menyadari bahwa itu adalah teknik standar. Tautan tentang menggunakanModule
simbol sebagai tipe referensi menarik!Definisi simbol sistem pencetakan tanpa konteks yang diawali
The
contextFreeDefinition[]
Fungsi bawah akan mencoba untuk mencetak definisi simbol tanpa konteks umum paling ditambahkan. Definisi kemudian dapat disalin ke Workbench dan diformat untuk dibaca (pilih, klik kanan, Sumber -> Format)dengan Aturan []
Peringatan: Fungsi ini tidak melokalisasi variabel dengan cara
With
dan cara yang samaModule
, yang berarti bahwa konstruksi pelokalan bersarang tidak akan berfungsi seperti yang diharapkan.withRules[{a -> 1, b -> 2}, With[{a=3}, b_ :> b]]
akan menggantikana
danb
di dalam sarangWith
danRule
, sementaraWith
tidak melakukan ini.Ini adalah varian
With
yang menggunakan aturan alih-alih=
dan:=
:Saya menemukan ini berguna saat membersihkan kode yang ditulis selama variabel percobaan dan pelokalan. Kadang-kadang saya berakhir dengan daftar parameter dalam bentuk
{par1 -> 1.1, par2 -> 2.2}
. DenganwithRules
nilai parameter mudah untuk menyuntikkan ke dalam kode yang sebelumnya ditulis menggunakan variabel global.Penggunaannya seperti
With
:Antialiasing grafis 3D
Ini adalah teknik yang sangat sederhana untuk antialias grafik 3D bahkan jika perangkat keras grafis Anda tidak mendukungnya secara asli.
Ini sebuah contoh:
Perhatikan bahwa nilai besar
n
atau ukuran gambar besar cenderung mengekspos bug driver grafis atau memperkenalkan artefak.Fungsionalitas notebook beda
Fungsionalitas notebook beda tersedia dalam
<<AuthorTools`
paket, dan (setidaknya dalam versi 8) dalamNotebookTools`
konteks tidak berdokumen . Ini adalah GUI kecil untuk membedakan dua notebook yang saat ini terbuka:sumber
a = 3; b = 4;
sebelum panggilan contoh Anda, dan kemudian meneleponwithRules
. Anda dapat menyimpannya dengan bukannya menggunakan berikut:SetAttributes[withRules, HoldAll];withRules[rules_, expr_] := Unevaluated[expr] /. Unevaluated[rules]
. Perbedaan antara semantik pada waktuWith
itu: 1. sisi peraturan sekarang tidak dievaluasi 2.withRules
tidak menyelesaikan konflik penamaan dengan konstruk pelingkupan batin sepertiWith
halnya. Yang terakhir cukup serius - menjadi hal yang baik atau buruk tergantung pada kasusnya.With
. Ini tidak selalu bekerja dengan konstruk lokalisasi builtin, misalnyaWith[{a=1}, Block[{a=2}, a]]
. Apakah Anda pikir ada alasan bagus mengapa sarangBlock
tidak terlokalisasi di sana, seperti bersarangWith
danModule
tidak?)Unevaluated[rules]
karena saya inginx -> 1+1
mengevaluasi RHS.With
mudah dikenali dan dihindari, tetapi polanya tidak:With[{a = 1}, a_ -> a]
melokalisasi bagian dalama
sementarawithRules
tidak. Apakah Anda tahu jika ada cara untuk mengakses mekanisme lokalisasi internal Mathematica dan membuat konstruksi baru (mirip denganRule
) yang juga melokalkan? Saya mungkin akan menghapus jawaban ini nanti karena lebih berbahaya daripada berguna, tetapi saya ingin bermain dengannya sedikit lebih dulu.InheritedBlock
cukup keren dan menyelesaikan masalah dengan sangat elegan. Mengenai konflik pelingkupan, biasanya pengikatan untuk pelingkupan leksikal terjadi pada "waktu pengikatan leksikal", yaitu - sebelum run-time, sementara pelingkupan dinamis mengikat pada run-time, yang mungkin menjelaskannya. Anda dapat membandingkan ini dengan kasus serupa untukModule
, yang memungkinkan penggunaan yang konstruktif (lihat misalnya di sini stackoverflow.com/questions/7394113/... ). Masalahnya adalah bahwaBlock
perlu beberapa simbol untuk ...Fungsi murni rekursif (
#0
) tampaknya menjadi salah satu sudut bahasa yang lebih gelap. Berikut adalah beberapa contoh non-sepele dari penggunaannya, di mana ini benar-benar berguna (bukan berarti mereka tidak dapat dilakukan tanpa itu). Berikut ini adalah fungsi yang cukup ringkas dan cukup cepat untuk menemukan komponen yang terhubung dalam grafik, diberikan daftar tepi yang ditentukan sebagai pasangan simpul:Apa yang terjadi di sini adalah bahwa kita pertama-tama memetakan simbol boneka pada masing-masing nomor dhuwur, dan kemudian mengatur cara itu, mengingat sepasang simpul
{f[5],f[10]}
, katakanlah, kemudianf[5]
akan dievaluasif[10]
. Fungsi murni rekursif digunakan sebagai kompresor jalur (untuk mengatur memoisasi sedemikian rupa sehingga alih-alih rantai panjang sepertif[1]=f[3],f[3]=f[4],f[4]=f[2], ...
, nilai memoized dikoreksi setiap kali "root" baru dari komponen ditemukan. Ini memberikan kecepatan yang signifikan. Karena kami menggunakan penugasan, kami membutuhkannya Hold Hold, yang membuat konstruksi ini menjadi lebih tidak jelas dan lebih menarik). Fungsi ini adalah hasil dari diskusi Mathgroup on dan off-line yang melibatkan Fred Simons, Szabolcs Horvat, DrMajorBob dan Anda benar-benar. Contoh:Ini tentu jauh lebih lambat daripada built-in, tetapi untuk ukuran kode, IMO masih cukup cepat.
Contoh lain: di sini adalah realisasi rekursif
Select
, berdasarkan daftar tertaut dan fungsi murni rekursif:Sebagai contoh,
Namun itu tidak benar tail recursive, dan akan meniup stack (crash the kernel) untuk daftar yang lebih besar. Berikut ini adalah versi ekor-rekursif:
Sebagai contoh,
sumber
Ini adalah resep dari buku Stan Wagon ... gunakan ketika Plot bawaan berperilaku tidak menentu karena kurangnya presisi
Saya sering menggunakan trik berikut dari Kristjan Kannike ketika saya membutuhkan perilaku "seperti kamus" dari downgrade Mathematica
Ketika hasil evaluasi membingungkan, kadang-kadang membantu membuang langkah-langkah evaluasi ke dalam file teks
sumber
Dimungkinkan untuk menjalankan MathKernel dalam mode batch dengan menggunakan opsi baris perintah
-batchinput
-batchoutput
tanpa dokumen dan :(di mana
input.m
file input batch diakhiri dengan karakter baris baru,outputfile.txt
adalah file yang hasilnya akan dialihkan).Dalam Mathematica v.> = 6 MathKernel memiliki opsi baris perintah tanpa dokumen:
yang mengontrol apakah MathKernel akan memiliki ikon yang terlihat di Taskbar (setidaknya di bawah Windows).
FrontEnd (setidaknya dari v.5) memiliki opsi baris perintah tanpa dokumen
yang menonaktifkan splash-screen dan memungkinkan untuk menjalankan Mathematica FrontEnd jauh lebih cepat
dan opsi
yang menonaktifkan mekanisme yang meluncurkan versi Mathematica terbaru yang diinstal alih-alih meluncurkan versi yang terkait dengan file .nb di registri sistem.
Cara lain untuk melakukan ini mungkin adalah :
Berguna untuk menggabungkan opsi baris perintah terakhir dengan menyetel opsi FrontEnd global
VersionedPreferences->True
yang menonaktifkan berbagi preferensi antara berbagai versi Mathematica yang diinstal :(Di atas harus dievaluasi dalam versi Mathematica terbaru yang diinstal.)
Dalam Mathematica 8 ini dikontrol dalam dialog Preferensi, di panel Sistem, di bawah pengaturan "Buat dan pertahankan preferensi front end khusus versi" .
Dimungkinkan untuk mendapatkan daftar opsi baris perintah dari FrontEnd yang tidak lengkap dengan menggunakan kunci tidak berdokumen
-h
(kode untuk Windows):memberi:
Pilihan lain termasuk:
Apakah ada opsi baris perintah yang berpotensi bermanfaat dari MathKernel dan FrontEnd? Silakan bagikan jika Anda tahu.
Pertanyaan terkait .
sumber
-32
dan berarti bahwa bitness dari MathKernel yang digunakan oleh FrontEnd akan cocok dengan bitness dari sistem operasi (64 bit). Tampaknya dalam kasus lain opsi ini tidak akan mengubah apa pun.Peretasan favorit saya adalah makro penghasil kode kecil yang memungkinkan Anda untuk mengganti sekelompok perintah boilerplate standar dengan satu perintah pendek. Atau, Anda dapat membuat perintah untuk membuka / membuat buku catatan.
Inilah yang saya gunakan untuk sementara waktu dalam alur kerja Mathematica saya sehari-hari. Saya menemukan diri saya melakukan banyak hal berikut:
Melakukan semua ini dengan tangan berulang-ulang adalah rasa sakit, jadi mari kita mengotomatisasi! Pertama, beberapa kode utilitas:
Sekarang, mari kita buat makro yang akan menempatkan sel-sel berikut di buku catatan:
Dan inilah makro:
Sekarang ketika saya mengetik
MyPrivatize[]
adalah menciptakan konteks pribadi dan memuat paket standar saya. Sekarang mari kita membuat perintah yang akan membuka buku catatan awal baru dengan konteks pribadi sendiri (sehingga Anda dapat meretas di sana dengan pengabaian liar tanpa risiko mengacaukan definisi), tetapi memiliki akses ke konteks Anda saat ini.Yang keren tentang ini adalah karena
SelfDestruct
, ketika perintah dijalankan tidak meninggalkan jejak di notebook saat ini - yang bagus, karena kalau tidak, itu hanya akan membuat kekacauan.Untuk poin gaya tambahan, Anda dapat membuat pemicu kata kunci untuk makro ini menggunakan
InputAutoReplacements
, tapi saya akan meninggalkan ini sebagai latihan untuk pembaca.sumber
PutAppend dengan PageWidth -> Infinity
Dalam Mathematica, penggunaan
PutAppend
perintah adalah cara yang paling mudah untuk mempertahankan file log yang sedang berjalan dengan hasil perhitungan perantara. Tetapi ia menggunakanPageWith->78
pengaturan default ketika mengekspor ekspresi ke file dan karenanya tidak ada jaminan bahwa setiap output antara hanya akan mengambil satu baris dalam log.PutAppend
tidak memiliki opsi itu sendiri tetapi menelusuri evaluasinya mengungkapkan bahwa itu didasarkan padaOpenAppend
fungsi yang memilikiPageWith
opsi dan memungkinkan mengubah nilai defaultnya denganSetOptions
perintah:Jadi kita bisa
PutAppend
menambahkan hanya satu baris sekaligus dengan menetapkan:MEMPERBARUI
Ada bug yang diperkenalkan di versi 10 (diperbaiki di versi 11.3):
SetOptions
tidak lagi memengaruhi perilakuOpenWrite
danOpenAppend
.Solusinya adalah dengan mengimplementasikan versi Anda sendiri
PutAppend
denganPageWidth -> Infinity
opsi eksplisit :Perhatikan bahwa kami juga dapat mengimplementasikannya melalui
WriteString
seperti yang ditunjukkan dalam jawaban ini , tetapi dalam hal ini akan diperlukan untuk terlebih dahulu mengubah ekspresi menjadiInputForm
via yang sesuaiToString[expr, InputForm]
.sumber
Aku hanya melihat melalui salah satu paket saya untuk dimasukkan dalam ini, dan menemukan beberapa pesan yang saya didefinisikan bahwa keajaiban pekerjaan:
Debug::<some name>
. Secara default, mereka dimatikan, jadi jangan menghasilkan banyak overhead. Tapi, saya bisa membuang kode saya dengan mereka, dan menyalakannya jika saya perlu mencari tahu persis bagaimana sedikit kode berperilaku.sumber
Debug
maupun bukanTrace
; itu adalah satu set pesan yang saya buat sehingga saya bisa membuang kode saya untuk menghidupkan / mematikan sesuka hati. Mereka diawali dengan kataDebug
, dengan cara yang samausage
pesan diawali dengan nama fungsi. Ini menyediakan fungsi yang sama dengan menempatkan banyakcout
pernyataan dalam kode c ++.Salah satu hal yang menggangguku tentang konstruksi pelingkupan bawaan adalah bahwa mereka mengevaluasi semua definisi variabel lokal sekaligus, jadi Anda tidak dapat menulis misalnya
Jadi beberapa waktu yang lalu saya datang dengan makro bernama WithNest yang memungkinkan Anda untuk melakukan ini. Saya merasa berguna, karena memungkinkan Anda menjaga binding variabel lokal tanpa harus melakukan sesuatu seperti
Pada akhirnya, cara terbaik yang bisa saya temukan untuk melakukan ini adalah dengan menggunakan simbol khusus untuk membuatnya lebih mudah untuk mengulang daftar bindings, dan saya memasukkan definisi ke dalam paketnya sendiri untuk menjaga simbol ini tersembunyi. Mungkin seseorang memiliki solusi yang lebih sederhana untuk masalah ini?
Jika Anda ingin mencobanya, masukkan yang berikut ke dalam file bernama
Scoping.m
:sumber
Yang ini ditulis oleh Alberto Di Lullo, (yang tampaknya tidak berada di Stack Overflow).
CopyToClipboard
, untuk Mathematica 7 (di Mathematica 8, bawaannya)Posting asli: http://forums.wolfram.com/mathgroup/archive/2010/Jun/msg00148.html
Saya telah menemukan rutinitas ini berguna untuk menyalin bilangan real yang besar ke clipboard dalam bentuk desimal biasa. Misalnya
CopyToClipboard["123456789.12345"]
Cell[OutputFormData@expr]
menghapus tanda kutip dengan rapi.sumber
Kode ini membuat palet yang mengunggah pilihan ke Stack Exchange sebagai gambar. Pada Windows, disediakan tombol ekstra yang memberikan rendering pemilihan yang lebih setia.
Salin kode ke sel buku catatan dan evaluasi. Kemudian keluarkan palet dari output, dan instal menggunakan
Palettes -> Install Palette...
Jika Anda memiliki masalah dengan itu, kirim komentar di sini. Unduh versi notebook di sini .
sumber
Saya yakin banyak orang telah menemui situasi di mana mereka menjalankan beberapa hal, menyadari itu tidak hanya menghambat program, tetapi mereka juga belum menabung selama 10 menit terakhir!
EDIT
Setelah menderita ini selama beberapa waktu, saya suatu hari menemukan bahwa seseorang dapat membuat auto-save dari dalam kode Mathematica . Saya pikir menggunakan penyelamatan otomatis seperti itu telah banyak membantu saya di masa lalu, dan saya selalu merasa bahwa kemungkinan itu sendiri adalah sesuatu yang tidak banyak orang sadari dapat mereka lakukan.
Kode asli yang saya gunakan ada di bagian bawah. Berkat komentar yang saya temukan ternyata bermasalah, dan jauh lebih baik melakukannya dengan cara alternatif, menggunakan
ScheduledTask
(yang hanya akan berfungsi di Mathematica 8).Kode untuk ini dapat ditemukan dalam jawaban ini dari
Sjoerd C. de Vries
(Karena saya tidak yakin apakah boleh menyalinnya ke sini, saya meninggalkannya sebagai tautan saja.)Solusi di bawah ini menggunakan
Dynamic
. Ini akan menghemat notebook setiap 60 detik, tetapi tampaknya hanya jika selnya terlihat . Saya meninggalkannya di sini hanya untuk alasan penyelesaian. (dan untuk pengguna Mathematica 6 dan 7)/ EDIT
Untuk mengatasinya saya menggunakan kode ini di awal buku catatan:
Ini akan menghemat pekerjaan Anda setiap 60 detik.
Saya lebih suka
NotebookAutoSave[]
karena menyimpan sebelum input diproses, dan karena beberapa file lebih banyak teks daripada input.Saya awalnya menemukannya di sini: http://en.wikipedia.org/wiki/Talk:Mathematica#Criticisms
Perhatikan bahwa sekali menjalankan baris ini, penyimpanan akan terjadi bahkan jika Anda menutup dan membuka kembali file Anda (selama pembaruan dinamis diaktifkan).
Selain itu, karena tidak ada undo di Mathematica , berhati-hatilah untuk tidak menghapus semua konten Anda, karena menyimpan akan membuatnya tidak dapat dibalikkan (sebagai langkah pencegahan, saya menghapus kode ini dari setiap buku catatan yang sudah selesai)
sumber
NotebookSave[SelectedNotebook[], "work-" <> IntegerString[i] <> ".nb"]; i++
, tetapi saya pikir segala jenis referensi ke nama notebook saat ini akan menjadi rekursif.Dynamic
objek hanya akan di-refresh ketika terlihat, jadi saya tidak akan yakin bahwa metode ini akan berfungsi jika Anda menggulirDynamic
objek keluar dari area yang terlihat. Kemudian lagi, saya belum mencoba. Bagaimanapun, saya hanya menawarkannya sebagai saran.Dynamic[Refresh[i++, UpdateInterval -> 1, TrackedSymbols -> {}]]
. Gulir angka yang bertambah dari pandangan, tunggu sebentar, gulir ke belakang dan lihat jumlahnya tidak bertambah 60. TentangUpdateInterval
: ini biasanya digunakan jika memungkinkan, tetapi jika kode Anda mencakup variabel yang berubah, perubahan ini memicu penyegaran baru sebelum Interval berakhir. Coba baris di atas tanpaTrackedSymbols
Ingat bahwa The Mathematica Book juga tersedia online di http://reference.wolfram.com/legacy/v5_2/ - meskipun itu digantikan oleh dokumentasi saat ini di http://reference.wolfram.com
sumber
Saya merasa sangat berguna ketika mengembangkan paket untuk menambahkan pintasan keyboard ini ke
SystemFiles/FrontEnd/TextResources/Windows/KeyEventTranslations.tr
file saya .Berikutnya untuk setiap
Packagename.m
saya membuatPackagenameTest.nb
buku catatan untuk pengujian dan 2 sel pertama dari buku catatan uji ditetapkan sebagai sel inisialisasi. Di sel pertama saya taruhuntuk memuat pustaka PackageManipulations yang sangat berguna yang ditulis oleh Leonid. Sel kedua berisi
yang semuanya melakukan reload paket yang sebenarnya. Perhatikan dua baris pertama yang ada hanya untuk
Remove
semua simbol karena saya ingin menjaga konteksnya sebersih mungkin.Maka alur kerja untuk menulis dan menguji suatu paket menjadi seperti ini.
Packagename.m
.PackagenameTest.nb
dan lakukanCTRL + ALT + i
.Ini menyebabkan sel inisialisasi memuat ulang paket, yang membuat pengujian menjadi sangat sederhana.
sumber
Fungsi berikut
format[expr_]
dapat digunakan untuk indent / memformatmathematica
ekspresi yang tidak diformat yang membentang di atas halamanref: /codegolf/3088/indent-a-string-using-given-parentheses
sumber
format@RandomInteger[10,{3,3}]
): pastebin.com/nUT54Emq Karena Anda sudah memiliki dasar-dasarnya dan Anda tertarik pada ini, dapatkah Anda meningkatkan kode ke menghasilkan pemformatan bermanfaat yang dapat dibaca? Maka langkah selanjutnya adalah membuat tombol tempel yang akan membuat sel input dengan kode Mathematica yang terindentasi dengan baik (lebih baik menjaga komentar !!) Lihat juga pertanyaan saya yang terkait .