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:
LevelSchemees 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 
grassmannOpspaquete 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. GrassmannAlgebraPaquete 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:
MASHes 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-scriptopción).- Un 
alternate Mathematica shellcon 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
MathSourcetiene muchos útiles aunque portátiles estrechos para diversas aplicaciones. Consulte también las otras secciones, comoCurrent Documentation,Coursewarepara conferencias,- y 
Demospara, 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 queLeonidresponder 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
ReapySowque 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ónhacepta 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
SparseArraytodo 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
GatherByque no puede agrupar múltiples niveles de la expresión de la manera más simpleGatherByposible. Sin embargo,Mapfunciona 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
SelectEquivalentspodemos 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
Unionaquí 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,Unionelimina estas imágenes adicionales. Además,GatherByproducirí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 elIdentityfuncionar 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
Fortrancó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:
Evaluatablehabilita la funcionalidad MAYÚS + ENTRAR para la celda. La evaluación llamará alCellEvaluationFunctionpasar el contenido de la celda y el tipo de contenido como argumentos (shellEvaluateignora el último argumento).CellFrameLabelses 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
shellEvaluatese 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,CellPrologyCellDynamicExpression.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
CellEvaluationFunctionCreo que también podría usarse para piratear sintaxis de bajo nivel.CellEvaluationFunctionel gancho que estabas buscando?Cellopció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 diferentesCells 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
Unprotectverdad tiene que ser, simplemente se dejó de lado. El punto deBlock(alcance dinámico) y$inMsges exactamente para evitar la recursión infinita. Debido a$inMsgque no está definido en el exterior (este es un requisito importante), al principio, seTrueQevalúaFalsee 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.DownValuestiempo de ejecución, puede ver esta publicación groups.google.com/group/comp.soft-sys.math.mathematica/… , por ejemplo (SetDelayedredefinició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
ThrowyCatchy es un poco más fácil de analizar:EDITAR: Aquí hay una versión de acl (tomada de aquí ):
fuente
CatchyThrowdeberían haber sido utilizados con etiquetas de excepción únicas.ThrowyCatch" en lugar de "ReapySow".RepeatedTimingque hacer esto.Internal`InheritedBlockRecientemente he aprendido la existencia de funciones tan útiles como las
Internal`InheritedBlockde este mensaje de Daniel Lichtblau en el grupo de noticias oficial.Según tengo entendido,
Internal`InheritedBlockpermite pasar una copia de una función saliente dentro delBlockalcance:¡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
afunciona, pero no tenemos una copia del originaladentro delBlockalcance.Ahora intentemos
Internal`InheritedBlock:¡Tenemos una copia de la definición original
adentro delBlockalcance 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
defineque me permite permanecer disciplinado, con mucho menos repetitivo.Un uso básico de
definees así:Al principio no parece mucho, pero hay algunos beneficios ocultos. El primer servicio que
defineproporciona es que se aplica automáticamenteClearAllal 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,
defineacepta un atributo adicional llamadoOpen. Esto evitadefineagregar 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.nbcontenga:Y agregue esto a mi
Kernel\init.m:Ahora empiezo Mathematica abriendo
Invisible.nbPuede haber una mejor manera, pero esto me ha servido bien.
Personalizado
FoldyFoldListFold[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
CompileRecientemente, Daniel Lichtblau mostró este método que nunca había visto antes. En mi opinión, extiende significativamente la utilidad de
Compilefuente
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
ScreenStyleEvironmentglobal$FrontEnd) pero se imprimen en el"Printout"entorno de estilo (que es el valor predeterminado para la opciónPrintingStyleEnvironmentglobal$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 estableceMagnificationen 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ónPrintingStyleEnvironmentglobal$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
Magnifyincorporando 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
ImageResolutionsugirió 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
Exportde"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 ► Metafileelemento 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 codememorización estándar .c:Cache[expr_] := c = expr.SelectEquivalents. Sin embargo, creo que seguiríaTagOnElementsiendo el segundo parámetro predeterminado,Identityya 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, yTagPatternen su lugar. Ambos,TagPatternyMapLevelson 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
Conditionfunciona cuando se usa en una definición. Sifoosolo 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
Conditionmá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
.marchivo 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
Moduleemula cierres léxicos para crear el equivalente de los tipos de referencia. Aquí hay una pila simple (que utiliza una variación delConditiontruco 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
HeldExpressionselemento en los paquetes, no lo sabía. Estaba generalmente importadores, tal como cadena y luego usarToExpressionconHoldCompletecuya última arg. Con respecto al usoConditionde 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 deModulevars, 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.Conditioncosa 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 deModulesí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
Withy loModulehace, 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 reemplaceayben el anidadoWithyRule, mientras queWithno lo hace.Esta es una variante de
Withque 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 loswithRulesvalores 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
no 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 deWithentonces: 1. Ahora los lados de las reglas no son evalúan los 2.withRulesno resuelve los conflictos de nomenclatura con las construcciones de alcance interno como loWithhace. El último es bastante serio: ser bueno o malo según el caso.Withs 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.BlockNo hace Localizar allí, como anidadoWithyModulelo hace?)Unevaluated[rules]porque queríax -> 1+1evaluar el RHS.Withs anidados son fáciles de detectar y evitar, pero los patrones no lo son:With[{a = 1}, a_ -> a]localiza el interioramientraswithRulesque 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.InheritedBlockes 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 queBlocknecesita 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-batchoutputno documentadas y :(donde
input.mestá el archivo de entrada por lotes que termina con el carácter de nueva línea,outputfile.txtes 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->Trueque 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
-32y 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
PutAppendcomando es la forma más sencilla de mantener un archivo de registro en ejecución con resultados de cálculos intermedios. Pero utiliza laPageWith->78configuració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.PutAppendno tiene ninguna opción en sí, pero el seguimiento de sus evaluaciones revela que se basa en laOpenAppendfunción que tiene laPageWithopción y permite cambiar su valor predeterminado mediante elSetOptionscomando:Entonces podemos
PutAppendagregar 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):
SetOptionsya no afecta el comportamiento deOpenWriteyOpenAppend.Una solución alternativa es implementar su propia versión de
PutAppendcon laPageWidth -> Infinityopción explícita :Tenga en cuenta que también podemos implementarla
WriteStringcomo se muestra en esta respuesta, pero en este caso será necesario convertir preliminarmente la expresión en laInputFormví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
Debugni lasTracefunciones; 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 unusagemensaje está precedido por el nombre de la función. Proporciona la misma funcionalidad que colocar un montón decoutsentencias 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.Dynamicobjetos solo se actualizan cuando son visibles, por lo que no estaría seguro de que este método funcionaría si, por ejemplo, desplaza elDynamicobjeto 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 sinTrackedSymbolsRecuerde 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.trarchivo.A continuación, cada vez
Packagename.mque hago unPackagenameTest.nbcuaderno 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
Removetodos 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.nby 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 / formatearmathematicaexpresiones 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 .