Todos sabemos que Mathematica es excelente, pero a menudo también carece de una funcionalidad crítica. ¿Qué tipo de paquetes / herramientas / recursos externos utiliza con Mathematica?
Editaré (e invitaré a cualquier otra persona que lo haga también) esta publicación principal para incluir recursos que se centren en la aplicabilidad general en la investigación científica y que la mayor cantidad de personas posible encuentren útil. Siéntase libre de contribuir con cualquier cosa, incluso pequeños fragmentos de código (como hice a continuación para una rutina de sincronización).
Además, las características indocumentadas y útiles en Mathematica 7 y más allá de lo que se encontró, o desenterrado de algún documento / sitio son bienvenidas.
Incluya una breve descripción o comentario sobre por qué algo es genial o qué utilidad proporciona. Si enlaza a libros en Amazon con enlaces de afiliados, por favor mencione, por ejemplo, poniendo su nombre después del enlace.
Paquetes:
LevelScheme
es un paquete que expande enormemente la capacidad de Mathematica para producir trazados atractivos. Lo uso si no para otra cosa que para el control mucho, mucho mejor sobre las marcas de cuadros / ejes. Su versión más reciente se llama SciDraw, y se lanzará en algún momento de este año.- David Park's
Presentation Package
(US $ 50 - sin cargo por actualizaciones) - El
grassmannOps
paquete de Jeremy Michelson proporciona recursos para hacer álgebra y cálculo con variables y operadores de Grassmann que tienen relaciones de conmutación no triviales. GrassmannAlgebra
Paquete y libro de John Brown para trabajar con álgebras de Grassmann y Clifford.- El RISC (Instituto de Investigación para la Computación Simbólica) tiene una variedad de paquetes para Mathematica (y otros idiomas) disponibles para descargar. En particular, existe el Teorema para la demostración automatizada de teoremas, y la multitud de paquetes para suma simbólica, ecuaciones de diferencia, etc. en la página de software del grupo Algorithmic Combinatorics .
Herramientas:
MASH
es el excelente script de Perl de Daniel Reeves que esencialmente proporciona soporte de scripts para Mathematica v7. (Ahora integrado a partir de Mathematica 8 con la-script
opción).- Un
alternate Mathematica shell
con una entrada de línea de lectura GNU (usando python, * nix solamente) - El paquete ColourMaths le permite seleccionar visualmente partes de una expresión y manipularlas. http://www.dbaileyconsultancy.co.uk/colour_maths/colour_maths.html
Recursos:
El propio repositorio de Wolfram
MathSource
tiene muchos útiles aunque portátiles estrechos para diversas aplicaciones. Consulte también las otras secciones, comoCurrent Documentation
,Courseware
para conferencias,- y
Demos
para, bueno, demos.
El Mathematica Wikibook .
Libros:
- Programación de Mathematica: una introducción avanzada de Leonid Shifrin (
web
,pdf
) es una lectura obligada si desea hacer algo más que bucles For en Mathematica. Tenemos el placer de tener queLeonid
responder preguntas aquí. - Métodos cuánticos con Mathematica por James F. Feagin ( amazon )
- El libro de Mathematica de Stephen Wolfram ( amazon ) (
web
) - Esquema de Schaum ( amazon )
- Mathematica en acción por Stan Wagon ( Amazon ) - 600 páginas de ejemplos claros y sube a la versión 7. de Mathematica. Las técnicas de visualización son especialmente buenas, puede ver algunas de ellas en el autor
Demonstrations Page
. - Fundamentos de programación de Mathematica por Richard Gaylord (
pdf
) - Una buena introducción concisa a la mayoría de lo que necesita saber sobre la programación de Mathematica. - Mathematica Cookbook por Sal Mangano publicado por O'Reilly 2010 832 páginas. - Escrito en el conocido estilo O'Reilly Cookbook: Problema - Solución. Para intermedios.
- Ecuaciones diferenciales con Mathematica, 3ra ed. Elsevier 2004 Amsterdam por Martha L. Abell, James P. Braselton - 893 páginas Para principiantes, aprenda a resolver DE y Mathematica al mismo tiempo.
Características no documentadas (o apenas documentadas):
- Cómo personalizar los atajos de teclado de Mathematica. Ver
this question
. - Cómo inspeccionar patrones y funciones utilizadas por las propias funciones de Mathematica. Ver
this answer
- ¿Cómo lograr un tamaño consistente para GraphPlots en Mathematica? Ver
this question
. - Cómo producir documentos y presentaciones con Mathematica. Ver
this question
.
fuente
Grid
, o algo similar.Respuestas:
He mencionado esto antes, pero la herramienta que encuentro más útil es una aplicación
Reap
ySow
que imita / extiende el comportamiento deGatherBy
:Esto me permite agrupar listas por cualquier criterio y transformarlas en el proceso. La forma en que funciona es que una función de criterio (
f
) etiqueta cada elemento de la lista, cada elemento es transformado por una segunda función suministrada (g
), y la salida específica es controlada por una tercera función (h
). La funciónh
acepta dos argumentos: una etiqueta y una lista de los elementos recopilados que tienen esa etiqueta. Los elementos conservan su orden original, por lo que si configurah = #1&
, obtendrá un no ordenadoUnion
, como en los ejemplos deReap
. Pero, se puede usar para procesamiento secundario.Como ejemplo de su utilidad, he estado trabajando con Wannier90 que genera el Hamiltoniano espacialmente dependiente en un archivo donde cada línea es un elemento diferente en la matriz, de la siguiente manera
Para convertir esa lista en un conjunto de matrices, reuní todas las sublistas que contienen la misma coordenada, convertí la información del elemento en una regla (es decir, {i, j} -> Re [Hij] + I Im [Hij]), y luego convirtió las reglas recopiladas en un
SparseArray
todo con un solo revestimiento:Honestamente, esta es mi navaja suiza, y hace que las cosas complejas sean muy simples. La mayoría de mis otras herramientas son algo específicas del dominio, por lo que probablemente no las publique. Sin embargo, la mayoría, si no todos, de ellos hacen referencia
SelectEquivalents
.Editar : no imita por completo, ya
GatherBy
que no puede agrupar múltiples niveles de la expresión de la manera más simpleGatherBy
posible. Sin embargo,Map
funciona bien para la mayoría de lo que necesito.Ejemplo : @Yaroslav Bulatov ha pedido un ejemplo autónomo. Aquí hay uno de mi investigación que se ha simplificado enormemente. Entonces, digamos que tenemos un conjunto de puntos en un plano
y nos gustaría reducir el número de puntos mediante un conjunto de operaciones de simetría. (Para los curiosos, estamos generando el pequeño grupo de cada punto.) Para este ejemplo, usemos un eje de rotación de cuatro pliegues alrededor del eje z
Usando
SelectEquivalents
podemos agrupar los puntos que producen el mismo conjunto de imágenes bajo estas operaciones, es decir, son equivalentes, usando lo siguienteque produce 3 sublistas que contienen los puntos equivalentes. (Tenga en cuenta que
Union
aquí es absolutamente vital, ya que garantiza que cada punto produzca la misma imagen. Originalmente, lo uséSort
, pero si un punto se encuentra en un eje de simetría, es invariante bajo la rotación alrededor de ese eje dando una imagen adicional de sí mismo Entonces,Union
elimina estas imágenes adicionales. Además,GatherBy
produciría el mismo resultado.) En este caso, los puntos ya están en una forma que usaré, pero solo necesito un punto representativo de cada grupo y me gustaría contar de los puntos equivalentes. Como no necesito transformar cada punto, uso elIdentity
funcionar en la segunda posición. Para la tercera función, debemos tener cuidado. El primer argumento que se le pasará serán las imágenes de los puntos bajo las rotaciones, que para el punto{0,0,0}
es una lista de cuatro elementos idénticos, y usarlo arrojaría la cuenta. Sin embargo, el segundo argumento es solo una lista de todos los elementos que tienen esa etiqueta, por lo que solo contendrá{0,0,0}
. En codigo,Tenga en cuenta que este último paso se puede lograr con la misma facilidad
Pero, es fácil con esto y el ejemplo menos completo anterior para ver cómo son posibles transformaciones muy complejas con un mínimo de código.
fuente
Fortran
códigos mejor organizados y bien escritos que he visto. Casi me hace considerar usarFortran
...Una de las cosas buenas de la interfaz del cuaderno de Mathematica es que puede evaluar expresiones en cualquier idioma, no solo en Mathematica. Como un ejemplo simple, considere crear un nuevo tipo de celda de entrada de Shell que pase la expresión contenida al shell del sistema operativo para su evaluación.
Primero, defina una función que delegue la evaluación de un comando textual al shell externo:
El segundo argumento es necesario e ignorado por razones que se harán evidentes más adelante. A continuación, queremos crear un nuevo estilo llamado Shell :
Shell
.Use la siguiente expresión de celda como Texto del Paso 6 :
La mayor parte de esta expresión se copió directamente del estilo del programa incorporado . Los cambios clave son estas líneas:
Evaluatable
habilita la funcionalidad MAYÚS + ENTRAR para la celda. La evaluación llamará alCellEvaluationFunction
pasar el contenido de la celda y el tipo de contenido como argumentos (shellEvaluate
ignora el último argumento).CellFrameLabels
es solo un detalle que permite al usuario identificar que esta celda es inusual.Con todo esto en su lugar, ahora podemos ingresar y evaluar una expresión de shell:
Es mejor mantener este estilo definido en una hoja de estilo ubicada centralmente. Además, las funciones de evaluación como
shellEvaluate
se definen mejor como apéndices utilizando DeclarePackage eninit.m
. Los detalles de ambas actividades están más allá del alcance de esta respuesta.Con esta funcionalidad, se pueden crear cuadernos que contienen expresiones de entrada en cualquier sintaxis de interés. La función de evaluación puede escribirse en puro Mathematica, o delegar cualquiera o todas las partes de la evaluación a una agencia externa. Tenga en cuenta que hay otros ganchos que se relacionan con la evaluación celular, como
CellEpilog
,CellProlog
yCellDynamicExpression
.Un patrón común implica escribir el texto de expresión de entrada en un archivo temporal, compilar el archivo en algún idioma, ejecutar el programa y capturar la salida para su visualización final en la celda de salida. Hay muchos detalles que abordar cuando se implementa una solución completa de este tipo (como capturar mensajes de error correctamente), pero uno debe apreciar el hecho de que no solo es posible hacer cosas como esta, sino también prácticas.
En una nota personal, son características como esta las que hacen que la interfaz del portátil sea el centro de mi universo de programación.
Actualizar
La siguiente función auxiliar es útil para crear tales celdas:
Se usa así:
Ahora, si
shellCell[]
se evalúa, la celda de entrada se eliminará y se reemplazará con una nueva celda de entrada que evalúa su contenido como un comando de shell.fuente
CellEvaluationFunction
Creo que también podría usarse para piratear sintaxis de bajo nivel.CellEvaluationFunction
el gancho que estabas buscando?Cell
opción que se relaciona con la evaluación de células -Evaluator -> "EvaluatorName"
. El significado de"EvaluatorName"
podría configurarse a través del cuadro de diálogo Evaluación :: Opciones de configuración del núcleo ... Todavía no sé si es posible configurarlo mediante programación ... Esta técnica permite utilizar diferentes MathKernels en diferentesCell
s en un cuaderno. Estos MathKernels pueden ser de diferentes versiones de Mathematica instaladas.Import
, o tal vez iniciar un proceso externo de Python y comunicarse a través de sus flujos (por ejemplo, usando un Java ProcessBuilder ). Estoy seguro de que hay una mejor manera de Mathematica - suena como una buena pregunta SO :)Todd Gayley (Wolfram Research) acaba de enviarme un buen truco que permite "ajustar" las funciones integradas con código arbitrario. Siento que tengo que compartir este útil instrumento. La siguiente es la respuesta de Todd en mi
question
.fuente
Unprotect
verdad tiene que ser, simplemente se dejó de lado. El punto deBlock
(alcance dinámico) y$inMsg
es exactamente para evitar la recursión infinita. Debido a$inMsg
que no está definido en el exterior (este es un requisito importante), al principio, seTrueQ
evalúaFalse
e ingresamos al cuerpo de la función. Pero cuando tenemos la llamada a la función dentro del cuerpo, la condición se evalúa comoFalse
(ya que la variable ha sido redefinida por Block). Por lo tanto, la regla definida por el usuario no coincide, y en su lugar se usa la regla incorporada.DownValues
tiempo de ejecución, puede ver esta publicación groups.google.com/group/comp.soft-sys.math.mathematica/… , por ejemplo (SetDelayed
redefinición) . Pero mi método es menos elegante, menos robusto, más propenso a errores y hace que la interrupción de la recursión sea mucho menos trivial de implementar. Entonces, en la mayoría de las situaciones, el método descrito por @Alexey gana sin dudas.Este no es un recurso completo, por lo que lo incluyo aquí en la sección de respuestas, pero lo he encontrado muy útil al resolver problemas de velocidad (que, desafortunadamente, es una gran parte de lo que trata la programación de Mathematica).
El uso es entonces simplemente
timeAvg@funcYouWantToTest
.EDIT: Sr. Asistente ha proporcionado una versión más simple que elimina
Throw
yCatch
y es un poco más fácil de analizar:EDITAR: Aquí hay una versión de acl (tomada de aquí ):
fuente
Catch
yThrow
deberían haber sido utilizados con etiquetas de excepción únicas.Throw
yCatch
" en lugar de "Reap
ySow
".RepeatedTiming
que hacer esto.Internal`InheritedBlock
Recientemente he aprendido la existencia de funciones tan útiles como las
Internal`InheritedBlock
de este mensaje de Daniel Lichtblau en el grupo de noticias oficial.Según tengo entendido,
Internal`InheritedBlock
permite pasar una copia de una función saliente dentro delBlock
alcance:¡Creo que esta función puede ser muy útil para todos los que necesiten modificar temporalmente las funciones integradas!
Comparación con el bloque
Definamos alguna función:
Ahora deseamos pasar una copia de esta función al
Block
ámbito. El juicio ingenuo no da lo que queremos:Ahora tratando de usar la definición retrasada en el primer argumento de
Block
(también es una característica no documentada):Vemos que en este caso
a
funciona, pero no tenemos una copia del originala
dentro delBlock
alcance.Ahora intentemos
Internal`InheritedBlock
:¡Tenemos una copia de la definición original
a
dentro delBlock
alcance y podemos modificarla de la manera que queramos sin afectar la definición global dea
!fuente
Mathematica es una herramienta aguda, pero puede cortarlo con su comportamiento algo sin tipo y avalanchas de mensajes de diagnóstico crípticos . Una forma de lidiar con esto es definir funciones siguiendo este modismo:
Eso es un montón de repeticiones, que con frecuencia me siento tentado a omitir. Especialmente cuando se realizan prototipos, lo que sucede mucho en Mathematica. Entonces, uso una macro llamada
define
que me permite permanecer disciplinado, con mucho menos repetitivo.Un uso básico de
define
es así:Al principio no parece mucho, pero hay algunos beneficios ocultos. El primer servicio que
define
proporciona es que se aplica automáticamenteClearAll
al símbolo que se está definiendo. Esto asegura que no haya definiciones sobrantes, una ocurrencia común durante el desarrollo inicial de una función.El segundo servicio es que la función que se define se "cierra" automáticamente. Con esto quiero decir que la función emitirá un mensaje y abortará si se invoca con una lista de argumentos que no coincide con una de las definiciones:
Este es el valor principal de
define
, que detecta una clase de error muy común.Otra conveniencia es una forma concisa de especificar atributos en la función que se está definiendo. Hagamos la función
Listable
:Además de todos los atributos normales,
define
acepta un atributo adicional llamadoOpen
. Esto evitadefine
agregar la definición de error general a la función:Se pueden definir múltiples atributos para una función:
Sin más preámbulos, aquí está la definición de
define
:La implementación exhibida no admite valores ascendentes ni currificación, ni patrones más generales que la definición de función simple. Sigue siendo útil, sin embargo.
fuente
Comience sin un cuaderno en blanco abierto
Me molestó que Mathematica comenzara con un cuaderno en blanco abierto. Podría cerrar este cuaderno con un script, pero aún así se abriría brevemente. Mi truco es crear un archivo que
Invisible.nb
contenga:Y agregue esto a mi
Kernel\init.m
:Ahora empiezo Mathematica abriendo
Invisible.nb
Puede haber una mejor manera, pero esto me ha servido bien.
Personalizado
Fold
yFoldList
Fold[f, x]
se hace equivalente aFold[f, First@x, Rest@x]
Por cierto, creo que esto puede llegar a una versión futura de Mathematica.¡Sorpresa! Esto se ha implementado, aunque actualmente no está documentado. Me informan que fue implementado en 2011 por Oliver Ruebenkoenig, aparentemente poco después de que publiqué esto. Gracias Oliver Ruebenkoenig!
Actualizado para permitir esto:
"Partición dinámica"
Ver Mathematica.SE post # 7512 para una nueva versión de esta función.
Con frecuencia quiero particionar una lista de acuerdo con una secuencia de longitudes.
ejemplo de pseudocódigo:
partition[{1,2,3,4,5,6}, {2,3,1}]
Salida:
{{1,2}, {3,4,5}, {6}}
Se me ocurrió esto:
Lo que luego completé con esto, incluida la prueba de argumentos:
El tercer argumento controla lo que sucede con los elementos más allá de la especificación dividida.
Los trucos de Mathematica de Szabolcs
El que uso con más frecuencia es la paleta de datos tabulares pegar
Modificar datos externos desde dentro
Compile
Recientemente, Daniel Lichtblau mostró este método que nunca había visto antes. En mi opinión, extiende significativamente la utilidad de
Compile
fuente
Compile
, toda mi publicación aquí: stackoverflow.com/questions/5246330/… , debía mostrar esta posibilidad en un entorno no trivial (ya había una solución más rápida y más corta al problema en cuestión) . En mi opinión, la mayor victoria aquí es la capacidad de emular el paso por referencia y dividir grandes funciones compiladas en fragmentos más manejables y reutilizables.Problemas y soluciones generales de exportación de PDF / EMF
1) Es completamente inesperado e indocumentado, pero Mathematica exporta y guarda gráficos en formatos PDF y EPS usando un conjunto de definiciones de estilo que difiere del que se usa para mostrar los Cuadernos en la pantalla. De manera predeterminada, las computadoras portátiles se muestran en la pantalla en el entorno de estilo "Trabajo" (que es el valor predeterminado para la opción
ScreenStyleEvironment
global$FrontEnd
) pero se imprimen en el"Printout"
entorno de estilo (que es el valor predeterminado para la opciónPrintingStyleEnvironment
global$FrontEnd
). Cuando uno exporta gráficos en formatos ráster como GIF y PNG o en formato EMF, Mathematica genera gráficos que se ven exactamente como se ven dentro de Notebook. Parece que el"Working"
El entorno de estilo se utiliza para renderizar en este caso. ¡Pero no es el caso cuando exporta / guarda algo en formato PDF o EPS! En este caso,"Printout"
entorno de estilo se usa por defecto yque difiere muy profundamente del entorno de estilo "de trabajo". En primer lugar, el"Printout"
entorno de estilo se estableceMagnification
en el 80% . En segundo lugar, utiliza sus propios valores para los tamaños de fuente de diferentes estilos y esto da como resultado cambios de tamaño de fuente inconsistentes en el archivo PDF genacional en comparación con la representación original en pantalla. Este último puede llamarse fluctuaciones de FontSize que son muy molestas. Pero, felizmente, esto se puede evitar configurando la opciónPrintingStyleEnvironment
global$FrontEnd
"Trabajar" :2) El problema común al exportar a formato EMF es que la mayoría de los programas (no solo Mathematica ) generan un archivo que se ve bien en el tamaño predeterminado pero se vuelve feo cuando lo amplías. Es porque los metarchivos se muestrean con la fidelidad de resolución de pantalla . La calidad del archivo EMF generado se puede mejorar
Magnify
incorporando el objeto gráfico original para que la exactitud del muestreo de los gráficos originales sea mucho más precisa. Compare dos archivos:Si inserta estos archivos en Microsoft Word y los acerca, verá que la primera "a" tiene un diente de sierra y la segunda no (probado con Mathematica 6).
Chris Degnen
ImageResolution
sugirió otra forma de hacerlo (esta opción tiene efecto al menos a partir de Mathematica 8):3) En Mathematica tenemos tres formas de convertir gráficos en metarchivos: a través
Export
de"EMF"
(forma muy recomendada: produce metarchivos con la mayor calidad posible), a través delSave selection As...
elemento del menú ( produce una figura mucho menos precisa , no se recomienda) y a través delEdit ► Copy As ► Metafile
elemento del menú ( lo recomiendo en contra de esta ruta ).fuente
Por demanda popular, el código para generar la trama de los 10 principales respondedores de SO (excepto las anotaciones ) utilizando la API de SO .
fuente
Expresiones de almacenamiento en caché
Encuentro estas funciones muy útiles para almacenar en caché cualquier expresión. Lo interesante aquí para estas dos funciones es que la expresión retenida en sí misma se usa como una clave de la tabla hash / símbolo Cache o CacheIndex, en comparación con la conocida memorización en matemática donde solo se puede almacenar en caché el resultado si la función se define como f [x_]: = f [x] = ... Para que pueda almacenar en caché cualquier parte de un código, esto es útil si se llama a una función varias veces, pero solo algunas partes del código no se deben volver a calcular.
Para almacenar en caché una expresión independientemente de sus argumentos.
La segunda vez, la expresión devuelve 6 sin esperar.
Para almacenar en caché una expresión usando una expresión de alias que puede depender de un argumento de la expresión en caché.
Si expr tarda un poco en calcular, es mucho más rápido evaluar {"f", 2}, por ejemplo, para recuperar el resultado almacenado en caché.
Para una variación de estas funciones con el fin de tener una memoria caché localizada (es decir, la memoria caché se libera automáticamente fuera de la construcción del bloque), vea esta publicación Evite llamadas repetidas a la interpolación
Eliminar valores en caché
Para eliminar valores almacenados en caché cuando no conoce el número de definiciones de una función. Considero que las definiciones tienen un espacio en blanco en algún lugar de sus argumentos.
Para eliminar los valores en caché cuando conoce el número de definiciones de una función (va un poco más rápido).
Esto utiliza el hecho de que las definiciones de una función se encuentran al final de su lista de DownValues, los valores almacenados en caché están antes.
Usar símbolos para almacenar datos y funciones similares a objetos
También aquí hay funciones interesantes para usar símbolos como objetos.
Ya es bien sabido que puede almacenar datos en símbolos y acceder rápidamente a ellos utilizando DownValues
Puede acceder a la lista de teclas (o propiedades) de un símbolo utilizando estas funciones en función de lo que envió en una publicación en este sitio:
Utilizo mucho esta función para mostrar todas las informaciones contenidas en los valores de un símbolo:
Finalmente, aquí hay una manera simple de crear un símbolo que se comporte como un objeto en la programación orientada a objetos (solo reproduce el comportamiento más básico de OOP pero la sintaxis me parece elegante):
Las propiedades se almacenan como DownValues y los métodos como Upvalues retrasados en el símbolo creado por el Módulo que se devuelve. Encontré la sintaxis para function2 que es la sintaxis OO habitual para funciones en la estructura de datos de árbol en Mathematica .
Para obtener una lista de los tipos de valores existentes que tiene cada símbolo, consulte http://reference.wolfram.com/mathematica/tutorial/PatternsAndTransformationRules.html y http://www.verbeia.com/mathematica/tips/HTMLLinks/Tricks_Misc_4.html .
Por ejemplo prueba esto
Puede ir más allá si desea emular la herencia de objetos utilizando un paquete llamado InheritRules disponible aquí http://library.wolfram.com/infocenter/MathSource/671/
También puede almacenar la definición de la función no en newObject sino en un símbolo de tipo, por lo que si NewObject devuelve el tipo [newObject] en lugar de newObject, podría definir la función y function2 de esta manera fuera de NewObject (y no dentro) y tener el mismo uso que antes .
Use UpValues [type] para ver que function y function2 están definidas en el símbolo de tipo.
Aquí se presentan más ideas sobre esta última sintaxis https://mathematica.stackexchange.com/a/999/66 .
Versión mejorada de SelectEquivalents
@rcollyer: Muchas gracias por traer SelectEquivalents a la superficie, es una función increíble. Aquí hay una versión mejorada de SelectEquivalents enumerados anteriormente con más posibilidades y el uso de opciones, esto hace que sea más fácil de usar.
Aquí hay ejemplos de cómo se puede usar esta versión:
Usando Mathematica Gather / Collect correctamente
¿Cómo haría una función de tabla dinámica en Mathematica?
Algoritmo de binning 2D rápido de Mathematica
Bolsa interna
Daniel Lichtblau describe aquí una interesante estructura interna de datos para listas crecientes.
Implementando un Quadtree en Mathematica
Funciones de depuración
Estas dos publicaciones apuntan a funciones útiles para la depuración:
¿Cómo depurar al escribir códigos pequeños o grandes usando Mathematica? banco de trabajo? depurador de mma? ¿o algo mas? (Enséñalo)
/programming/5459735/the-clearest-way-to-represent-mathematicas-evaluation-sequence/5527117#5527117 (TraceView)
Aquí hay otra función basada en Reap and Sow para extraer expresiones de diferentes partes de un programa y almacenarlas en un símbolo.
Aquí hay un ejemplo
Otros recursos
Aquí hay una lista de enlaces interesantes para aprender:
Una colección de recursos de aprendizaje de Mathematica
Actualizado aquí: https://mathematica.stackexchange.com/a/259/66
fuente
f[x_] := f[x] = some code
memorización estándar .c:Cache[expr_] := c = expr
.SelectEquivalents
. Sin embargo, creo que seguiríaTagOnElement
siendo el segundo parámetro predeterminado,Identity
ya que es el más utilizado. Tampoco creo que lo haya incluidoFinalOp
, ya que se puede manejar dentroOpOnTaggedElems
. También acortaría los nombres de las opciones, ya que su longitud hace que sea difícil escribir. IntentaTagFunction
,TransformElement
,TransformResults
, yTagPattern
en su lugar. Ambos,TagPattern
yMapLevel
son excelentes adiciones a la funcionalidad, y una buena reescritura, en general.Mis funciones de utilidad (tengo estas integradas en MASH, que se menciona en la pregunta):
fuente
Un truco que he usado, que le permite emular la forma en que la mayoría de las funciones integradas funcionan con argumentos malos (enviando un mensaje y luego devolviendo todo el formulario sin evaluar) explota una peculiaridad de la forma en que
Condition
funciona cuando se usa en una definición. Sifoo
solo debería funcionar con un argumento:Si tiene necesidades más complejas, es fácil descomponer la validación de argumentos y la generación de mensajes como una función independiente. Puede hacer cosas más elaboradas mediante el uso de efectos secundarios en
Condition
más allá de solo generar mensajes, pero en mi opinión, la mayoría de ellos entran en la categoría de "pirateo de mala calidad" y deben evitarse si es posible.Además, en la categoría "metaprogramación", si tiene un
.m
archivo de paquete de Mathematica ( ), puede usar el"HeldExpressions"
elemento para obtener todas las expresiones del archivoHoldComplete
. Esto hace que rastrear las cosas sea mucho más fácil que usar búsquedas basadas en texto. Desafortunadamente, no hay una manera fácil de hacer lo mismo con una computadora portátil, pero puede obtener todas las expresiones de entrada usando algo como lo siguiente:Por último, puede usar el hecho de que
Module
emula cierres léxicos para crear el equivalente de los tipos de referencia. Aquí hay una pila simple (que utiliza una variación delCondition
truco para el manejo de errores como un bono):¡Ahora puede imprimir los elementos de una lista en orden inverso de una manera innecesariamente complicada!
fuente
HeldExpressions
elemento en los paquetes, no lo sabía. Estaba generalmente importadores, tal como cadena y luego usarToExpression
conHoldComplete
cuya última arg. Con respecto al usoCondition
de mensajes: esta ha sido una técnica estándar en la redacción de paquetes desde al menos 1994. Con respecto a la persistencia a través deModule
vars, he tenido una larga publicación sobre eso en Mathgroup hace un tiempo: groups.google.com/group/comp.soft- sys.math.mathematica / ... (mi tercera publicación en ese hilo), está en la misma línea y tiene enlaces a algunos ejemplos no triviales de uso.Condition
cosa como tradición, probablemente de un compañero de trabajo, pero no me di cuenta de que era una técnica estándar. ¡El enlace sobre el uso deModule
símbolos como tipos de referencia es interesante!Imprimir definiciones de símbolos del sistema sin contexto antepuesto
La
contextFreeDefinition[]
siguiente función intentará imprimir la definición de un símbolo sin el contexto más común antepuesto. La definición se puede copiar a Workbench y formatear para facilitar su lectura (selecciónela, haga clic con el botón derecho, Fuente -> Formato)withRules []
Advertencia: esta función no localiza variables de la misma manera
With
y loModule
hace, lo que significa que las construcciones de localización anidadas no funcionarán como se esperaba.withRules[{a -> 1, b -> 2}, With[{a=3}, b_ :> b]]
se reemplacea
yb
en el anidadoWith
yRule
, mientras queWith
no lo hace.Esta es una variante de
With
que usa reglas en lugar de=
y:=
:Encontré esto útil mientras limpiaba el código escrito durante la experimentación y localizaba variables. De vez en cuando termino con listas de parámetros en forma de
{par1 -> 1.1, par2 -> 2.2}
. Con loswithRules
valores de los parámetros es fácil de inyectar en el código previamente escrito usando variables globales.El uso es como
With
:Antialiasing gráficos 3D
Esta es una técnica muy simple para antialias de gráficos 3D, incluso si su hardware de gráficos no lo admite de forma nativa.
Aquí hay un ejemplo:
Tenga en cuenta que un valor grande
n
o un tamaño de imagen grande tiende a exponer errores del controlador de gráficos o introducir artefactos.Funcionalidad diff del portátil
La funcionalidad de diferencias de Notebook está disponible en el
<<AuthorTools`
paquete y (al menos en la versión 8) en elNotebookTools`
contexto no documentado . Esta es una pequeña GUI para diferenciar dos cuadernos que están abiertos actualmente:fuente
a = 3; b = 4;
antes de su llamada de ejemplo y luego llamandowithRules
. Puede guardarlo en lugar de utilizar el siguiente:SetAttributes[withRules, HoldAll];withRules[rules_, expr_] := Unevaluated[expr] /. Unevaluated[rules]
. Las diferencias con la semántica de wrt deWith
entonces: 1. Ahora los lados de las reglas no son evalúan los 2.withRules
no resuelve los conflictos de nomenclatura con las construcciones de alcance interno como loWith
hace. El último es bastante serio: ser bueno o malo según el caso.With
s Esto no siempre funciona con las construcciones de orden interna de localización, ya sea, por ejemplo.With[{a=1}, Block[{a=2}, a]]
¿Cree que hay una buena razón por la anidada.Block
No hace Localizar allí, como anidadoWith
yModule
lo hace?)Unevaluated[rules]
porque queríax -> 1+1
evaluar el RHS.With
s anidados son fáciles de detectar y evitar, pero los patrones no lo son:With[{a = 1}, a_ -> a]
localiza el interiora
mientraswithRules
que no. ¿Sabe si hay alguna forma de acceder al mecanismo de localización interna de Mathematica y crear nuevas construcciones (similares aRule
) que también se localizan? Probablemente borre esta respuesta más tarde, ya que es más peligrosa que útil, pero me gustaría jugar con ella un poco más primero.InheritedBlock
es bastante bueno y resuelve el problema con mucha elegancia. En cuanto a los conflictos de alcance, normalmente los enlaces para el alcance léxico ocurren en el "tiempo de enlace léxico", que es - antes del tiempo de ejecución, mientras que el alcance dinámico se une en el tiempo de ejecución, lo que podría explicarlo. Puede contrastar esto con el caso similar paraModule
, que permite un uso constructivo (consulte, por ejemplo, aquí stackoverflow.com/questions/7394113/… ). El problema es queBlock
necesita algún símbolo para ...Las funciones recursivas puras (
#0
) parecen ser uno de los rincones más oscuros del lenguaje. Aquí hay un par de ejemplos no triviales de su uso, donde esto es realmente útil (no es que no se puedan hacer sin él). La siguiente es una función bastante concisa y razonablemente rápida para encontrar componentes conectados en un gráfico, dada una lista de aristas especificadas como pares de vértices:Lo que sucede aquí es que primero mapeamos un símbolo ficticio en cada uno de los números de vértice, y luego configuramos una forma que, dado un par de vértices
{f[5],f[10]}
, digamos, luegof[5]
evaluaríaf[10]
. La función recursiva pura se usa como un compresor de ruta (para configurar la memorización de tal manera que, en lugar de cadenas largas comof[1]=f[3],f[3]=f[4],f[4]=f[2], ...
, los valores memorizados se corrijan cada vez que se descubre una nueva "raíz" del componente. Esto da una aceleración significativa. Debido a que utilizamos la asignación, necesitamos que sea HoldAll, lo que hace que esta construcción sea aún más oscura y atractiva). Esta función es el resultado de una discusión de Mathgroup dentro y fuera de línea que involucra a Fred Simons, Szabolcs Horvat, DrMajorBob y los suyos de verdad. Ejemplo:Ciertamente es mucho más lento que un incorporado, pero para el tamaño del código, bastante rápido sigue siendo IMO.
Otro ejemplo: aquí hay una realización recursiva
Select
, basada en listas vinculadas y funciones recursivas puras:Por ejemplo,
Sin embargo, no es recursivo de cola correctamente, y volará la pila (bloqueará el núcleo) para listas más grandes. Aquí está la versión recursiva de la cola:
Por ejemplo,
fuente
Esta es una receta del libro de Stan Wagon ... úsela cuando la trama incorporada se comporte de manera irregular debido a la falta de precisión
A menudo uso el siguiente truco de Kristjan Kannike cuando necesito un comportamiento "similar a un diccionario" de los valores bajos de Mathematica
Cuando los resultados de la evaluación son confusos, a veces es útil volcar los pasos de evaluación en un archivo de texto
fuente
Es posible ejecutar MathKernel en modo por lotes utilizando opciones de línea de comandos
-batchinput
-batchoutput
no documentadas y :(donde
input.m
está el archivo de entrada por lotes que termina con el carácter de nueva línea,outputfile.txt
es el archivo al que se redirigirá la salida).En Mathematica v.> = 6, MathKernel tiene la opción de línea de comandos no documentada:
que controla si MathKernel tendrá un icono visible en la barra de tareas (al menos en Windows).
FrontEnd (al menos desde v.5) tiene una opción de línea de comandos no documentada
que deshabilita la pantalla de bienvenida y permite ejecutar Mathematica FrontEnd mucho más rápido
y opción
que desactiva el mecanismo que inicia la versión de Mathematica más reciente instalada en lugar de iniciar la versión asociada con los archivos .nb en el registro del sistema.
Otra forma de hacer esto probablemente es :
Es útil combinar la última opción de línea de comandos con la configuración de la opción Global FrontEnd
VersionedPreferences->True
que deshabilita el intercambio de preferencias entre las diferentes versiones de Mathematica instaladas :(Lo anterior debe evaluarse en el Mathematica más reciente versión instalada).
En Mathematica 8, esto se controla en el cuadro de diálogo Preferencias, en el panel Sistema, en la configuración "Crear y mantener preferencias de front-end específicas de la versión" .
Es posible obtener una lista incompleta de las opciones de la línea de comandos de FrontEnd utilizando una clave no documentada
-h
(el código para Windows):da:
Otras opciones incluyen:
¿Hay otras opciones de línea de comandos potencialmente útiles de MathKernel y FrontEnd? Por favor comparte si lo sabes.
Pregunta relacionada .
fuente
-32
y significa que la bitness del MathKernel utilizado por el FrontEnd coincidirá con la bitness del sistema operativo (64 bit). Parece que en otros casos esta opción no cambiará nada.Mis hacks favoritos son pequeñas macros generadoras de código que le permiten reemplazar un montón de comandos estándar por uno corto. Alternativamente, puede crear comandos para abrir / crear cuadernos.
Esto es lo que he estado usando durante un tiempo en mi flujo de trabajo diario de Mathematica. Me encontré realizando mucho lo siguiente:
Hacer todo esto a mano una y otra vez es un dolor, ¡así que automaticemos! Primero, un código de utilidad:
Ahora, creemos una macro que va a poner las siguientes celdas en el cuaderno:
Y aquí está la macro:
Ahora, cuando escribo,
MyPrivatize[]
crea el contexto privado y carga mi paquete estándar. Ahora creemos un comando que abrirá un nuevo bloc de notas con su propio contexto privado (para que pueda hackear allí con un abandono salvaje sin el riesgo de arruinar las definiciones), pero que tenga acceso a sus contextos actuales.Lo bueno de esto es que, debido a que
SelfDestruct
, cuando se ejecuta el comando, no deja rastro en el cuaderno actual, lo cual es bueno, porque de lo contrario simplemente crearía desorden.Para obtener puntos de estilo adicionales, puede crear activadores de palabras clave para estas macros
InputAutoReplacements
, pero lo dejaré como un ejercicio para el lector.fuente
PutAppend con PageWidth -> Infinity
En Mathematica, el uso del
PutAppend
comando es la forma más sencilla de mantener un archivo de registro en ejecución con resultados de cálculos intermedios. Pero utiliza laPageWith->78
configuración predeterminada al exportar expresiones a un archivo, por lo que no hay garantía de que cada salida intermedia tome solo una línea en el registro.PutAppend
no tiene ninguna opción en sí, pero el seguimiento de sus evaluaciones revela que se basa en laOpenAppend
función que tiene laPageWith
opción y permite cambiar su valor predeterminado mediante elSetOptions
comando:Entonces podemos
PutAppend
agregar solo una línea a la vez configurando:ACTUALIZAR
Hay un error introducido en la versión 10 (corregido en la versión 11.3):
SetOptions
ya no afecta el comportamiento deOpenWrite
yOpenAppend
.Una solución alternativa es implementar su propia versión de
PutAppend
con laPageWidth -> Infinity
opción explícita :Tenga en cuenta que también podemos implementarla
WriteString
como se muestra en esta respuesta, pero en este caso será necesario convertir preliminarmente la expresión en laInputForm
vía correspondienteToString[expr, InputForm]
.fuente
Yo estaba mirando a través de uno de mis paquetes para su inclusión en esta, y encontré algunos mensajes que he definido que funcionan de maravilla:
Debug::<some name>
. Por defecto, están apagados, por lo que no producen demasiados gastos generales. Pero, puedo llenar mi código con ellos y activarlos si necesito averiguar exactamente cómo se comporta un poco de código.fuente
Debug
ni lasTrace
funciones; Es un conjunto de mensajes que creé con los que puedo llenar mi código para encender / apagar a voluntad. Están precedidos por la palabraDebug
, de la misma manera que unusage
mensaje está precedido por el nombre de la función. Proporciona la misma funcionalidad que colocar un montón decout
sentencias en código c ++.Una de las cosas que me molesta acerca de las construcciones de alcance incorporadas es que evalúan todas las definiciones de variables locales a la vez, por lo que no puede escribir, por ejemplo
Así que hace un tiempo se me ocurrió una macro llamada WithNest que te permite hacer esto. Me resulta útil, ya que te permite mantener localmente los enlaces variables sin tener que hacer algo como
Al final, la mejor manera que pude encontrar para hacer esto fue mediante el uso de un símbolo especial para facilitar la repetición de la lista de enlaces, y puse la definición en su propio paquete para mantener este símbolo oculto. ¿Quizás alguien tiene una solución más simple para este problema?
Si quieres probarlo, pon lo siguiente en un archivo llamado
Scoping.m
:fuente
Este fue escrito por Alberto Di Lullo, (que no parece estar en Stack Overflow).
CopyToClipboard
, para Mathematica 7 (en Mathematica 8 está integrado)Publicación original: http://forums.wolfram.com/mathgroup/archive/2010/Jun/msg00148.html
He encontrado esta rutina útil para copiar grandes números reales al portapapeles en forma decimal ordinaria. P.ej
CopyToClipboard["123456789.12345"]
Cell[OutputFormData@expr]
elimina cuidadosamente las comillas.fuente
Este código crea una paleta que carga la selección en Stack Exchange como una imagen. En Windows, se proporciona un botón adicional que brinda una representación más fiel de la selección.
Copie el código en una celda del cuaderno y evalúe. Luego extraiga la paleta de la salida e instálela usando
Palettes -> Install Palette...
Si tiene algún problema, publique un comentario aquí. Descargue la versión del cuaderno aquí .
fuente
Estoy seguro de que muchas personas se han encontrado con la situación en la que ejecutan algunas cosas, al darse cuenta de que no solo bloquearon el programa, ¡sino que también no guardaron en los últimos 10 minutos!
EDITAR
Después de sufrir esto por un tiempo, un día descubrí que uno puede crear el guardado automático desde el código de Mathematica . Creo que usar ese auto-guardado me ha ayudado mucho en el pasado, y siempre sentí que la posibilidad en sí misma era algo que no mucha gente sabe que puede hacer.
El código original que utilicé está en la parte inferior. Gracias a los comentarios, descubrí que es problemático y que es mucho mejor hacerlo de forma alternativa, usando
ScheduledTask
(que solo funcionará en Mathematica 8).El código para esto se puede encontrar en esta respuesta de
Sjoerd C. de Vries
(Dado que no estoy seguro de si está bien copiarlo aquí, lo dejo solo como un enlace).La siguiente solución está usando
Dynamic
. Guardará el portátil cada 60 segundos, pero aparentemente solo si su celda es visible . Lo dejo aquí solo por razones de finalización. (y para usuarios de Mathematica 6 y 7)/EDITAR
Para resolverlo, uso este código al comienzo de un cuaderno:
Esto ahorrará su trabajo cada 60 segundos.
Lo prefiero
NotebookAutoSave[]
porque se guarda antes de que se procese la entrada y porque algunos archivos tienen más texto que entrada.Originalmente lo encontré aquí: http://en.wikipedia.org/wiki/Talk:Mathematica#Criticisms
Tenga en cuenta que una vez que se ejecuta esta línea, se guardará incluso si cierra y vuelve a abrir su archivo (siempre que la actualización dinámica esté habilitada).
Además, dado que no hay deshacer en Mathematica , tenga cuidado de no eliminar todo su contenido, ya que guardarlo lo hará irreversible (como medida de precaución, elimino este código de cada cuaderno terminado)
fuente
NotebookSave[SelectedNotebook[], "work-" <> IntegerString[i] <> ".nb"]; i++
, pero creo que cualquier tipo de referencia al nombre del cuaderno actual será recursivo.Dynamic
objetos solo se actualizan cuando son visibles, por lo que no estaría seguro de que este método funcionaría si, por ejemplo, desplaza elDynamic
objeto fuera del área visible. Por otra parte, no lo he intentado. En cualquier caso, simplemente lo ofrecí como sugerencia.Dynamic[Refresh[i++, UpdateInterval -> 1, TrackedSymbols -> {}]]
. Desplácese el número incremental desde la vista, espere un minuto, retroceda y vea que el número no se incrementa en 60. Acerca deUpdateInterval
: esto generalmente se usa si es posible, pero si su código incluye variables que cambian, este cambio desencadena una nueva actualización antes de finaliza el intervalo. Pruebe la línea anterior sinTrackedSymbols
Recuerde que The Mathematica Book también está disponible en línea en http://reference.wolfram.com/legacy/v5_2/ , aunque está reemplazado por la documentación actual en http://reference.wolfram.com
fuente
Me resulta muy útil al desarrollar paquetes para agregar este atajo de teclado a mi
SystemFiles/FrontEnd/TextResources/Windows/KeyEventTranslations.tr
archivo.A continuación, cada vez
Packagename.m
que hago unPackagenameTest.nb
cuaderno para probar y las primeras 2 celdas del cuaderno de prueba se configuran como celdas de inicialización. En la primera celda pusepara cargar la muy útil biblioteca PackageManipulations que fue escrita por Leonid. La segunda celda contiene
que todos hacen la recarga real del paquete. Tenga en cuenta que las dos primeras líneas están ahí solo para
Remove
todos los símbolos, ya que me gusta mantener los contextos lo más limpios posible.Luego, el flujo de trabajo para escribir y probar un paquete se convierte en algo como esto.
Packagename.m
.PackagenameTest.nb
y hazCTRL + ALT + i
.Esto hace que las celdas de inicialización recarguen el paquete, lo que hace que las pruebas sean realmente simples.
fuente
La siguiente función
format[expr_]
se puede usar para sangrar / formatearmathematica
expresiones sin formato que se extienden sobre una páginaref: /codegolf/3088/indent-a-string-using-given-parentheses
fuente
format@RandomInteger[10,{3,3}]
): pastebin.com/nUT54Emq Dado que ya tiene los conceptos básicos y le interesa, ¿puede mejorar el código para producir un formato útil legible? Luego, el siguiente paso sería hacer un botón de pegar que creará una celda de entrada con un código de Mathematica muy bien sangrado (¡preferiblemente preservando los comentarios!) Vea también mi pregunta relacionada .