Todos sabemos que o Mathematica é ótimo, mas também frequentemente não possui funcionalidade crítica. Que tipo de pacotes / ferramentas / recursos externos você usa com o Mathematica?
Editarei (e convido outras pessoas a fazê-lo também) este post principal para incluir recursos focados na aplicabilidade geral da pesquisa científica e que o maior número possível de pessoas achará útil. Sinta-se à vontade para contribuir com qualquer coisa, até pequenos trechos de código (como fiz abaixo para uma rotina de tempo).
Além disso, recursos não documentados e úteis no Mathematica 7 e além de você se encontrou, ou desenterrados de algum artigo / site, são bem-vindos.
Inclua uma breve descrição ou comentário sobre por que algo é ótimo ou qual utilitário ele fornece. Se você criar um link para livros na Amazon com links afiliados, mencione-o, por exemplo, colocando seu nome após o link.
Pacotes:
LevelScheme
é um pacote que expande bastante a capacidade do Mathematica de produzir gráficos de boa aparência. Eu o uso se não for para qualquer outra coisa, então para o controle muito melhorado sobre os carrapatos dos quadros / eixos. Sua versão mais recente é chamada SciDraw, e será lançada ainda este ano.- David Park's
Presentation Package
(US $ 50 - sem taxa para atualizações) - O
grassmannOps
pacote de Jeremy Michelson fornece recursos para fazer álgebra e cálculo com variáveis e operadores de Grassmann que têm relações de comutação não triviais. GrassmannAlgebra
Pacote e livro de John Brown para trabalhar com as álgebras de Grassmann e Clifford.- O RISC (Instituto de Pesquisa para Computação Simbólica) tem uma variedade de pacotes para o Mathematica (e outros idiomas) disponíveis para download. Em particular, existe o Theorema para a prova automatizada de teoremas e a infinidade de pacotes para soma simbólica, equações de diferença etc. na página de software do grupo Algorithmic Combinatorics .
Ferramentas:
MASH
é o excelente script Perl de Daniel Reeves, essencialmente fornecendo suporte a scripts para o Mathematica v7. (Agora incorporado no Mathematica 8 com a-script
opção.)- Um
alternate Mathematica shell
com uma entrada de linha de leitura GNU (usando python, * nix apenas) - O pacote ColourMaths permite selecionar visualmente partes de uma expressão e manipulá-las. http://www.dbaileyconsultancy.co.uk/colour_maths/colour_maths.html
Recursos:
O próprio repositório da Wolfram possui
MathSource
muitos notebooks úteis e estreitos para várias aplicações. Verifique também as outras seções, comoCurrent Documentation
,Courseware
para palestras,- e
Demos
para, bem, demonstrações.
Livros:
- Programação do Mathematica: uma introdução avançada de Leonid Shifrin (
web
,pdf
) é uma leitura obrigatória se você quiser fazer algo mais do que loops For no Mathematica. Temos o prazer deLeonid
responder ele mesmo aqui. - Métodos quânticos com o Mathematica por James F. Feagin ( amazon )
- O Livro Mathematica de Stephen Wolfram ( amazônia ) (
web
) - Esboço de Schaum ( amazônia )
- Mathematica in Action de Stan Wagon ( amazon ) - 600 páginas de exemplos legais e vão para o Mathematica versão 7. As técnicas de visualização são especialmente boas, você pode ver algumas delas no autor
Demonstrations Page
. - Fundamentos de programação do Mathematica por Richard Gaylord (
pdf
) - Uma boa introdução concisa para a maioria do que você precisa saber sobre a programação do Mathematica. - Livro de receitas do Mathematica de Sal Mangano publicado por O'Reilly 2010 832 páginas. - Escrito no conhecido estilo O'Reilly Cookbook: Problema - Solução. Para intermediários.
- Equações Diferenciais com Mathematica, 3ª Ed. Elsevier 2004 Amsterdam por Martha L. Abell, James P. Braselton - 893 páginas Para iniciantes, aprenda a resolver DEs e Mathematica ao mesmo tempo.
Recursos não documentados (ou pouco documentados):
- Como personalizar os atalhos de teclado do Mathematica. Veja
this question
. - Como inspecionar padrões e funções usadas pelas próprias funções do Mathematica. Vejo
this answer
- Como obter tamanho consistente para GraphPlots no Mathematica? Veja
this question
. - Como produzir documentos e apresentações com o Mathematica. Veja
this question
.
fonte
Grid
, ou qualquer coisa assim.Respostas:
Já mencionei isso antes, mas a ferramenta que acho mais útil é uma aplicação
Reap
eSow
que imita / estende o comportamento deGatherBy
:Isso me permite agrupar listas por qualquer critério e transformá-las no processo. A maneira como funciona é que uma função de critério (
f
) marca cada item da lista, cada item é transformado por uma segunda função fornecida (g
) e a saída específica é controlada por uma terceira função (h
). A funçãoh
aceita dois argumentos: uma marca e uma lista dos itens coletados que possuem essa marca. Os itens mantêm sua ordem original; portanto, se você definirh = #1&
, receberá uma ordem não ordenadaUnion
, como nos exemplos deReap
. Mas, pode ser usado para processamento secundário.Como exemplo de sua utilidade, tenho trabalhado com o Wannier90, que gera o Hamiltoniano espacialmente dependente em um arquivo em que cada linha é um elemento diferente na matriz, como segue
Para transformar essa lista em um conjunto de matrizes, reuni todas as sublistas que contêm a mesma coordenada, transformei as informações do elemento em uma regra (por exemplo, {i, j} -> Re [Hij] + I Im [Hij]) e em seguida, transformou as regras coletadas em um
SparseArray
tudo com o único liner:Honestamente, este é o meu canivete suíço, e torna as coisas complexas muito simples. A maioria das minhas outras ferramentas é um pouco específica do domínio, então provavelmente não as publicarei. No entanto, a maioria, se não todos, faz referência
SelectEquivalents
.Editar : não imita completamente,
GatherBy
pois não pode agrupar vários níveis da expressão da maneira mais simplesGatherBy
possível. No entanto,Map
funciona muito bem para a maioria do que eu preciso.Exemplo : @Yaroslav Bulatov pediu um exemplo independente. Aqui está uma das minhas pesquisas que foi bastante simplificada. Então, digamos que temos um conjunto de pontos em um plano
e gostaríamos de reduzir o número de pontos por um conjunto de operações de simetria. (Para os curiosos, estamos gerando o pequeno grupo de cada ponto.) Neste exemplo, vamos usar um eixo de rotação de quatro vezes ao redor do eixo z
Usando
SelectEquivalents
, podemos agrupar os pontos que produzem o mesmo conjunto de imagens nessas operações, ou seja, são equivalentes, usando o seguinteque produz 3 sublistas contendo os pontos equivalentes. (Observe que
Union
é absolutamente vital aqui, pois garante que a mesma imagem seja produzida por cada ponto. Originalmente, eu useiSort
, mas se um ponto está em um eixo de simetria, é invariante sob a rotação sobre esse eixo, fornecendo uma imagem extra de si mesmo. Portanto,Union
elimina essas imagens extras. Além disso,GatherBy
produziria o mesmo resultado.) Nesse caso, os pontos já estão em uma forma que eu usarei, mas eu só preciso de um ponto representativo de cada agrupamento e gostaria de uma contagem dos pontos equivalentes. Desde que eu não preciso transformar cada ponto, eu uso oIdentity
função na segunda posição. Para a terceira função, precisamos ter cuidado. O primeiro argumento passado a ele serão as imagens dos pontos sob as rotações que, para o ponto,{0,0,0}
são uma lista de quatro elementos idênticos, e usá-lo eliminaria a contagem. No entanto, o segundo argumento é apenas uma lista de todos os elementos que possuem essa tag, portanto, ela conterá apenas{0,0,0}
. Em código,Observe que este último passo pode ser realizado com a mesma facilidade
Porém, é fácil com este e o exemplo menos completo acima ver como transformações muito complexas são possíveis com um mínimo de código.
fonte
Fortran
códigos organizados e bem escritos que já vi. Faz-me quase considerar o uso deFortran
... #Uma das coisas boas da interface do notebook Mathematica é que ele pode avaliar expressões em qualquer idioma, não apenas no Mathematica. Como um exemplo simples, considere criar um novo tipo de célula de entrada do Shell que transmita a expressão contida no shell do sistema operacional para avaliação.
Primeiro, defina uma função que delegue a avaliação de um comando textual ao shell externo:
O segundo argumento é necessário e ignorado por razões que se tornarão aparentes mais tarde. Em seguida, queremos criar um novo estilo chamado Shell :
Shell
.Use a seguinte expressão de célula como o Texto da Etapa 6 :
A maior parte dessa expressão foi copiada diretamente do estilo interno do programa . As principais mudanças são estas linhas:
Evaluatable
habilita a funcionalidade SHIFT + ENTER para a célula. A avaliação chamará aCellEvaluationFunction
aprovação do conteúdo da célula e do tipo de conteúdo como argumentos (shellEvaluate
ignora o último argumento).CellFrameLabels
é apenas uma delicadeza que permite ao usuário identificar que essa célula é incomum.Com tudo isso no lugar, agora podemos inserir e avaliar uma expressão de shell:
É melhor manter esse estilo definido em uma folha de estilo localizada centralmente. Além disso, funções de avaliação como
shellEvaluate
são melhor definidas como stubs usando DeclarePackage noinit.m
. Os detalhes de ambas as atividades estão além do escopo desta resposta.Com essa funcionalidade, é possível criar blocos de anotações que contêm expressões de entrada em qualquer sintaxe de interesse. A função de avaliação pode ser escrita no Mathematica puro ou delegar uma ou todas as partes da avaliação a uma agência externa. Esteja ciente de que existem outros ganchos relacionados à avaliação de células, como
CellEpilog
,CellProlog
eCellDynamicExpression
.Um padrão comum envolve gravar o texto da expressão de entrada em um arquivo temporário, compilar o arquivo em algum idioma, executar o programa e capturar a saída para a exibição final na célula de saída. Há muitos detalhes a serem abordados ao implementar uma solução completa desse tipo (como capturar mensagens de erro corretamente), mas é preciso apreciar o fato de que não é apenas possível fazer coisas como essa, mas também praticar.
Em uma nota pessoal, são características como essa que fazem do notebook a interface do centro do meu universo de programação.
Atualizar
A seguinte função auxiliar é útil para criar essas células:
É usado assim:
Agora, se
shellCell[]
for avaliada, a célula de entrada será excluída e substituída por uma nova célula de entrada que avalia seu conteúdo como um comando de shell.fonte
CellEvaluationFunction
também poderia ser usado para hackers de baixo nível de sintaxe.CellEvaluationFunction
o gancho que você estava procurando?Cell
opção relacionada à avaliação celular -Evaluator -> "EvaluatorName"
. O significado de"EvaluatorName"
pode ser configurado através da caixa de diálogo Evaluation :: Kernel Configuration Options .... Ainda não sei se é possível configurá-lo programaticamente ... Essa técnica permite usar MathKernels diferentesCell
em s diferentes em um Notebook. Esses MathKernels podem ser de diferentes versões do Mathematica instaladas.Import
, ou talvez iniciar um processo externo do Python e se comunicar através de seus fluxos (por exemplo, usando um Java ProcessBuilder ). Estou certo que há uma maneira melhor Mathematica - soa como uma pergunta boa SO :)Todd Gayley (Wolfram Research) acabou de me enviar um belo truque que permite "quebrar" funções internas com código arbitrário. Sinto que tenho que compartilhar esse instrumento útil. A seguir está a resposta de Todd no meu
question
.fonte
Unprotect
fato tem que ser, foi deixado de fora. O ponto deBlock
(escopo dinâmico) e$inMsg
é exatamente para impedir a recursão infinita. Como$inMsg
é indefinido do lado de fora (esse é um requisito importante), inicialmenteTrueQ
avalia comoFalse
e entramos no corpo da função. Mas quando temos a chamada de função dentro do corpo, a condição é avaliada comoFalse
(uma vez que a variável foi redefinida pelo bloco). Portanto, a regra definida pelo usuário não corresponde e a regra interna é usada.DownValues
tempo de execução. Você pode ver esta postagem groups.google.com/group/comp.soft-sys.math.mathematica/… , por exemplo (SetDelayed
redefinição) . Mas meu método é menos elegante, menos robusto, mais suscetível a erros e torna a quebra da recursão muito menos trivial para implementar. Portanto, na maioria das situações, o método descrito por @Alexey vence.Este não é um recurso completo, portanto, eu o jogo aqui na seção de respostas, mas achei muito útil ao descobrir problemas de velocidade (o que, infelizmente, é uma grande parte do que é a programação do Mathematica).
O uso é então simplesmente
timeAvg@funcYouWantToTest
.EDIT: Mr. Assistente forneceu uma versão mais simples que elimina
Throw
eCatch
e é um pouco mais fácil de analisar:EDIT: Aqui está uma versão do acl (retirada daqui ):
fonte
Catch
eThrow
deveriam ter sido usados com tags de exceção exclusivas.Throw
eCatch
" em vez de "Reap
eSow
".RepeatedTiming
para fazer isso.Internal`InheritedBlock
Eu aprendi recentemente a existência de uma função útil que
Internal`InheritedBlock
, a partir desta mensagem de Daniel Lichtblau, no grupo de notícias oficial.Pelo que entendi,
Internal`InheritedBlock
permite passar uma cópia de uma função de saída dentro doBlock
escopo:Eu acho que essa função pode ser muito útil para todos que precisam modificar temporariamente as funções internas!
Comparação com bloco
Vamos definir alguma função:
Agora queremos passar uma cópia desta função para o
Block
escopo. O julgamento ingênuo não dá o que queremos:Agora, tentando usar a definição atrasada no primeiro argumento de
Block
(também é um recurso não documentado):Vemos que, nesse caso,
a
funciona, mas não temos uma cópia do originala
dentro doBlock
escopo.Agora vamos tentar
Internal`InheritedBlock
:Temos uma cópia da definição original
a
dentro doBlock
escopo e podemos modificá-la da maneira que queremos, sem afetar a definição global paraa
!fonte
O Mathematica é uma ferramenta afiada, mas pode reduzir o seu comportamento um pouco digitado e avalanches de mensagens de diagnóstico enigmáticas . Uma maneira de lidar com isso é definir funções seguindo este idioma:
Isso é muito clichê, que muitas vezes sou tentado a ignorar. Especialmente na criação de protótipos, o que acontece muito no Mathematica. Então, eu uso uma macro chamada
define
que me permite ficar disciplinado, com muito menos clichê.Um uso básico de
define
é assim:Não parece muito a princípio, mas existem alguns benefícios ocultos. O primeiro serviço que
define
fornece é que ele se aplica automaticamenteClearAll
ao símbolo que está sendo definido. Isso garante que não haja definições restantes - uma ocorrência comum durante o desenvolvimento inicial de uma função.O segundo serviço é que a função que está sendo definida é automaticamente "fechada". Com isso, quero dizer que a função emitirá uma mensagem e abortará se for invocada com uma lista de argumentos que não corresponde a uma das definições:
Esse é o valor principal de
define
, que captura uma classe de erro muito comum.Outra conveniência é uma maneira concisa de especificar atributos na função que está sendo definida. Vamos fazer a função
Listable
:Além de todos os atributos normais,
define
aceita um atributo adicional chamadoOpen
. Isso evitadefine
adicionar a definição de erro geral à função:Vários atributos podem ser definidos para uma função:
Sem mais delongas, aqui está a definição de
define
:A implementação exibida não suporta valores superiores nem currying, nem padrões mais gerais que a simples definição de função. Continua sendo útil, no entanto.
fonte
Comece sem um notebook em branco aberto
Fiquei incomodado com o Mathematica começar com um caderno em branco aberto. Eu poderia fechar este caderno com um script, mas ele ainda seria aberto brevemente. Meu truque é criar um arquivo
Invisible.nb
contendo:E adicione isso ao meu
Kernel\init.m
:Agora inicio o Mathematica abrindo
Invisible.nb
Pode haver uma maneira melhor, mas isso me serviu bem.
Personalizado
Fold
eFoldList
Fold[f, x]
é equivalente aFold[f, First@x, Rest@x]
Aliás, acredito que isso pode chegar a uma versão futura do Mathematica.Surpresa! Isso foi implementado, embora atualmente não esteja documentado. Fui informado de que foi implementado em 2011 por Oliver Ruebenkoenig, aparentemente pouco depois de eu ter postado isso. Obrigado Oliver Ruebenkoenig!
Atualizado para permitir isso:
"Partição dinâmica"
Consulte a publicação no 7512 do Mathematica.SE para obter uma nova versão desta função.
Freqüentemente, quero particionar uma lista de acordo com uma sequência de comprimentos.
exemplo de pseudo-código:
partition[{1,2,3,4,5,6}, {2,3,1}]
Resultado:
{{1,2}, {3,4,5}, {6}}
Eu vim com isso:
Que então completei com isso, incluindo teste de argumento:
O terceiro argumento controla o que acontece com os elementos além da especificação de divisão.
Os truques do Mathematica de Szabolcs
O que eu uso com mais frequência é a paleta Colar dados tabulares
Modifique dados externos de dentro
Compile
Recentemente, Daniel Lichtblau mostrou esse método que eu nunca tinha visto antes. Na minha opinião, estende significativamente a utilidade de
Compile
fonte
Compile
- todo o meu post aqui: stackoverflow.com/questions/5246330/… , era mostrar essa possibilidade em uma configuração não trivial (havia uma solução mais rápida e mais rápida para o problema em questão postado lá) . Na IMO, a maior vitória aqui é a capacidade de emular passagem por referência e dividir grandes funções compiladas em blocos mais gerenciáveis e reutilizáveis.Problemas e soluções gerais de exportação de PDF / EMF
1) É completamente inesperado e não documentado, mas o Mathematica exporta e salva gráficos nos formatos PDF e EPS usando um conjunto de definições de estilo diferentes do utilizado para exibir os Notebooks na tela. Por padrão, os notebooks são exibidos na tela no ambiente de estilo "Trabalho" (que é o valor padrão da opção
ScreenStyleEvironment
global$FrontEnd
), mas são impressos no"Printout"
ambiente de estilo (que é o valor padrão da opçãoPrintingStyleEnvironment
global$FrontEnd
). Quando se exporta gráficos em formatos rasterizados, como GIF e PNG ou no formato EMF, o Mathematica gera gráficos que se parecem exatamente com os do Notebook. Parece que o"Working"
ambiente de estilo é usado para renderização neste caso. Mas não é o caso quando você exporta / salva qualquer coisa nos formatos PDF ou EPS! Nesse caso, o"Printout"
ambiente de estilo é usado por padrão, que difere muito do ambiente de estilo "Trabalhando". Primeiro de tudo, o"Printout"
ambiente de estilo é definidoMagnification
como 80% . Em segundo lugar, ele usa seus próprios valores para os tamanhos de fonte de diferentes estilos e isso resulta em alterações inconsistentes no tamanho do arquivo PDF gerado em comparação com a representação original na tela. O último pode ser chamado de flutuações do FontSize, que são muito irritantes. Felizmente, isso pode ser evitado configurando a opçãoPrintingStyleEnvironment
global$FrontEnd
como "Trabalhando" :2) O problema comum com a exportação para o formato EMF é que a maioria dos programas (não apenas o Mathematica ) gera um arquivo com uma aparência agradável no tamanho padrão, mas que se torna feio quando você o amplia. Isso ocorre porque os metarquivos são amostrados com a fidelidade da resolução da tela . A qualidade do arquivo EMF gerado pode ser aprimorada
Magnify
inserindo o objeto gráfico original, para que a exatidão da amostragem dos gráficos originais se torne muito mais precisa. Compare dois arquivos:Se você inserir esses arquivos no Microsoft Word e ampliá-los, verá que o primeiro "a" tem serra enquanto o segundo não (testado com o Mathematica 6).
Outro caminho
ImageResolution
sugerido por Chris Degnen (esta opção tem efeito pelo menos a partir do Mathematica 8):3) No Mathematica , temos três maneiras de converter gráficos em metarquivo: via
Export
para"EMF"
(maneira altamente recomendada: produz metarquivo com a mais alta qualidade possível), viaSave selection As...
item de menu ( produz um valor muito menos preciso , não recomendado) e viaEdit ► Copy As ► Metafile
item de menu ( eu recomendo fortemente contra esta rota ).fonte
Por demanda popular, o código para gerar os 10 principais respondedores de SO (exceto anotações ) usando a API SO .
fonte
Armazenando em cache expressões
Acho essas funções muito úteis para armazenar em cache qualquer expressão. O interessante aqui para essas duas funções é que a própria expressão retida é usada como uma chave do hashtable / symbol Cache ou CacheIndex, em comparação com a conhecida memorização no mathematica, na qual você só pode armazenar em cache o resultado se a função for definida como f [x_]: = f [x] = ... Para que você possa armazenar em cache qualquer parte de um código, isso é útil se uma função precisar ser chamada várias vezes, mas apenas algumas partes do código não devem ser recalculadas.
Armazenar em cache uma expressão independentemente de seus argumentos.
Na segunda vez que a expressão retorna 6 sem esperar.
Para armazenar em cache uma expressão usando uma expressão de alias que pode depender de um argumento da expressão em cache.
Se o expr levar algum tempo para calcular, é muito mais rápido avaliar {"f", 2} por exemplo, para recuperar o resultado em cache.
Para obter uma variação dessas funções para ter um cache localizado (por exemplo, a memória do cache é liberada automaticamente fora da construção do bloco), consulte este post. Evite chamadas repetidas para a Interpolação
Excluindo valores em cache
Para excluir valores em cache quando você não souber o número de definições de uma função. Considero que as definições têm um espaço em branco em algum lugar de seus argumentos.
Para excluir valores em cache quando você souber o número de definições de uma função (vai um pouco mais rápido).
Isso usa o fato de que as definições de uma função estão no final de sua lista DownValues, os valores em cache são anteriores.
Usando símbolos para armazenar dados e funções semelhantes a objetos
Também aqui estão funções interessantes para usar símbolos como objetos.
Já é sabido que você pode armazenar dados em símbolos e acessá-los rapidamente usando DownValues
Você pode acessar a lista de chaves (ou propriedades) de um símbolo usando estas funções com base em quais itens enviados em uma postagem neste site:
Eu uso muito essa função para exibir todas as informações contidas nos DownValues de um símbolo:
Finalmente, aqui está uma maneira simples de criar um símbolo que se comporta como um objeto na programação orientada a objetos (apenas reproduz o comportamento mais básico do OOP, mas acho a sintaxe elegante):
As propriedades são armazenadas como DownValues e os métodos como Upvalues atrasados no símbolo criado pelo Módulo retornado. Encontrei a sintaxe da função2, que é a sintaxe OO usual para funções na estrutura de dados da Árvore no Mathematica .
Para obter uma lista dos tipos existentes de valores que cada símbolo possui, consulte http://reference.wolfram.com/mathematica/tutorial/PatternsAndTransformationRules.html e http://www.verbeia.com/mathematica/tips/HTMLLinks/Tricks_Misc_4.html .
Por exemplo, tente isso
Você pode ir além se quiser emular a herança de objetos usando um pacote chamado InheritRules disponível aqui http://library.wolfram.com/infocenter/MathSource/671/
Você também pode armazenar a definição da função não em newObject, mas em um símbolo de tipo, portanto, se NewObject retornou o tipo [newObject] em vez de newObject, você poderia definir a função e a função2 como essa fora do NewObject (e não dentro) e ter o mesmo uso de antes .
Use UpValues [type] para ver se a função e a function2 estão definidas no símbolo de tipo.
Outras idéias sobre esta última sintaxe são apresentadas aqui https://mathematica.stackexchange.com/a/999/66 .
Versão aprimorada do SelectEquivalents
@rcollyer: Muito obrigado por trazer o SelectEquivalents à superfície, é uma função incrível. Aqui está uma versão aprimorada dos SelectEquivalents listados acima, com mais possibilidades e opções, o que facilita o uso.
Aqui estão exemplos de como esta versão pode ser usada:
Usando o Mathematica Gather / Collect corretamente
Como você faria uma função de tabela dinâmica no Mathematica?
Algoritmo de binning 2D rápido do Mathematica
Internal`Bag
Daniel Lichtblau descreve aqui uma estrutura de dados interna interessante para listas crescentes.
Implementando um Quadtree no Mathematica
Funções de depuração
Essas duas postagens apontam para funções úteis para depuração:
Como depurar ao escrever códigos pequenos ou grandes usando o Mathematica? bancada de trabalho? depurador de mma? ou alguma outra coisa? (Mostre)
/programming/5459735/the-clearest-way-to-represent-mathematicas-evaluation-sequence/5527117#5527117 (TraceView)
Aqui está outra função baseada em Reap e Sow para extrair expressões de diferentes partes de um programa e armazená-las em um símbolo.
Aqui está um exemplo
Outros recursos
Aqui está uma lista de links interessantes para fins de aprendizado:
Uma coleção de recursos de aprendizado do Mathematica
Atualizado aqui: https://mathematica.stackexchange.com/a/259/66
fonte
f[x_] := f[x] = some code
memorização padrão .c:Cache[expr_] := c = expr
.SelectEquivalents
. Eu acho que eu continuariaTagOnElement
como o segundo parâmetro padrãoIdentity
, pois é o mais usado deles. Também não acho que eu tenha incluídoFinalOp
, já que pode ser tratado lá dentroOpOnTaggedElems
. Eu também reduzia os nomes das opções, já que o tamanho delas dificulta a digitação. TenteTagFunction
,TransformElement
,TransformResults
, eTagPattern
em vez disso. Ambos,TagPattern
eMapLevel
são ótimas adições à funcionalidade e uma boa reescrita, em geral.Minhas funções de utilidade (eu tenho essas embutidas no MASH, mencionadas na pergunta):
fonte
Um truque que usei, que permite emular a maneira como a maioria das funções internas funciona com argumentos ruins (enviando uma mensagem e retornando todo o formulário sem avaliação), explora uma peculiaridade do caminho
Condition
funciona quando usado em uma definição. Sefoo
deve funcionar apenas com um argumento:Se você tiver necessidades mais complexas, é fácil considerar a validação de argumentos e a geração de mensagens como uma função independente. Você pode fazer coisas mais elaboradas usando efeitos colaterais
Condition
além de apenas gerar mensagens, mas, na minha opinião, a maioria deles se enquadra na categoria "sleazy hack" e deve ser evitada, se possível.Além disso, na categoria "metaprogramação", se você tiver um
.m
arquivo Mathematica package ( ), poderá usar o"HeldExpressions"
elemento para obter todas as expressões do arquivo agrupadas emHoldComplete
. Isso torna o rastreamento de coisas muito mais fácil do que usar pesquisas baseadas em texto. Infelizmente, não há uma maneira fácil de fazer a mesma coisa com um notebook, mas você pode obter todas as expressões de entrada usando algo como o seguinte:Por fim, você pode usar o fato de
Module
emular fechamentos lexicais para criar o equivalente aos tipos de referência. Aqui está uma pilha simples (que usa uma variação, oCondition
truque para lidar com erros como um bônus):Agora você pode imprimir os elementos de uma lista em ordem inversa de uma maneira desnecessariamente complicada!
fonte
HeldExpressions
elemento em pacotes, não sabia disso. Normalmente, eu estava importando como string e depois usandoToExpression
comHoldComplete
como último argumento. Com relação ao usoCondition
de mensagens - essa é uma técnica padrão na criação de pacotes desde pelo menos 1994. Com relação à persistência por meio deModule
vars - eu tive um longo post sobre isso no Mathgroup há pouco tempo: groups.google.com/group/comp.soft- sys.math.mathematica /… (minha terceira postagem nesse segmento), está na mesma linha e possui links para alguns exemplos de uso não triviais.Condition
coisa como tradição, provavelmente de um colega de trabalho, mas não percebi que era uma técnica padrão. O link sobre o uso deModule
símbolos como tipos de referência é interessante!Definições de símbolo do sistema de impressão sem contexto anexado
A
contextFreeDefinition[]
função abaixo tentará imprimir a definição de um símbolo sem o contexto mais comum anexado. A definição pode ser copiada no Workbench e formatada para facilitar a leitura (selecione-a, clique com o botão direito do mouse em Source -> Format)withRules []
Advertência: Esta função não localiza variáveis da mesma maneira
With
e oModule
faz, o que significa que construções de localização aninhadas não funcionarão conforme o esperado.withRules[{a -> 1, b -> 2}, With[{a=3}, b_ :> b]]
irá substituira
eb
na aninhadoWith
eRule
, ao mesmo tempoWith
não faz isso.Essa é uma variante
With
que usa regras em vez de=
e:=
:Achei isso útil ao limpar o código escrito durante a experimentação e localizar variáveis. Ocasionalmente, acabo com listas de parâmetros na forma de
{par1 -> 1.1, par2 -> 2.2}
. Com oswithRules
valores dos parâmetros, é fácil injetar código previamente escrito usando variáveis globais.O uso é como
With
:Antialiasing gráficos 3D
Essa é uma técnica muito simples para antialiasizar gráficos 3D, mesmo que seu hardware gráfico não o suporte nativamente.
Aqui está um exemplo:
Observe que um valor grande
n
ou um tamanho de imagem grande tende a expor os erros do driver gráfico ou a apresentar artefatos.Funcionalidade diferencial do notebook
A funcionalidade diff do notebook está disponível no
<<AuthorTools`
pacote e (pelo menos na versão 8) noNotebookTools`
contexto não documentado . Esta é uma pequena interface gráfica para diferenciar dois notebooks que estão abertos no momento:fonte
a = 3; b = 4;
antes da sua chamada de exemplo e depois chamandowithRules
. Você pode salvá-lo por vez usando o seguinte:SetAttributes[withRules, HoldAll];withRules[rules_, expr_] := Unevaluated[expr] /. Unevaluated[rules]
. As diferenças semânticas daWith
época: 1. os lados das regras agora não são avaliados 2.withRules
não resolve os conflitos de nomenclatura com as construções de escopo interno, como oWith
faz. O último é bem sério - ser bom ou ruim, dependendo do caso.With
s aninhados . Isso também nem sempre funciona com as construções de localização incorporadas, por exemploWith[{a=1}, Block[{a=2}, a]]
. Você acha que há um bom motivo para o aninhadoBlock
não localizar lá, como aninhadoWith
eModule
faz?)Unevaluated[rules]
porque queriax -> 1+1
avaliar o RHS.With
s aninhados são fáceis de identificar e evitar, mas os padrões não são:With[{a = 1}, a_ -> a]
localizam o interiora
enquantowithRules
não. Você sabe se existe alguma maneira de acessar o mecanismo de localização interno do Mathematica e criar novas construções (semelhantes aRule
) que também localizam? Provavelmente vou excluir esta resposta mais tarde, pois é mais perigoso do que útil, mas gostaria de brincar com ela um pouco mais antes.InheritedBlock
é bem legal e resolve o problema com muita elegância. Quanto aos conflitos de escopo, normalmente as ligações para o escopo lexical ocorrem no "tempo de ligação lexical", que é - antes do tempo de execução, enquanto o escopo dinâmico é vinculado no tempo de execução, o que pode explicar isso. Você pode contrastar isso com o caso semelhante deModule
, que permite um uso construtivo (veja, por exemplo, aqui stackoverflow.com/questions/7394113/… ). O problema é queBlock
precisa de algum símbolo para ...Funções puras recursivas (
#0
) parecem ser um dos cantos mais escuros do idioma. Aqui estão alguns exemplos não triviais de seu uso, nos quais isso é realmente útil (não que eles não possam ser feitos sem ele). A seguir, é uma função bastante concisa e razoavelmente rápida para encontrar componentes conectados em um gráfico, dada uma lista de arestas especificadas como pares de vértices:O que acontece aqui é que primeiro mapeamos um símbolo fictício em cada um dos números de vértice e, em seguida, criamos uma maneira que, dado um par de vértices
{f[5],f[10]}
, digamos,f[5]
avaliaria comof[10]
. A função pura recursiva é usada como um compressor de caminho (para configurar a memorização de tal maneira que, em vez de longas cadeiasf[1]=f[3],f[3]=f[4],f[4]=f[2], ...
, os valores memorizados são corrigidos sempre que uma nova "raiz" do componente é descoberta, o que proporciona uma aceleração significativa. Como usamos a atribuição, precisamos que ela seja HoldAll, o que torna essa construção ainda mais obscura e mais atraente). Esta função é resultado de discussões on-line e off-line do Mathgroup envolvendo Fred Simons, Szabolcs Horvat, DrMajorBob e o seu verdadeiramente. Exemplo:É certamente muito mais lento que um built-in, mas para o tamanho do código, bastante rápido ainda é IMO.
Outro exemplo: aqui está uma realização recursiva de
Select
, com base em listas vinculadas e funções puras recursivas:Por exemplo,
No entanto, não é corretamente recursivo da cauda e irá explodir a pilha (travar o kernel) para listas maiores. Aqui está a versão recursiva da cauda:
Por exemplo,
fonte
Esta é a receita do livro de Stan Wagon ... use-a quando o lote embutido se comporta de forma irregular devido à falta de precisão
Costumo usar o seguinte truque de Kristjan Kannike, quando preciso de um comportamento "tipo dicionário" a partir dos valores baixos do Mathematica
Quando os resultados da avaliação são confusos, às vezes ajuda despejar as etapas da avaliação em um arquivo de texto
fonte
É possível executar o MathKernel no modo em lote usando opções de linha de comando não
-batchinput
-batchoutput
documentadas e :(onde
input.m
é o arquivo de entrada em lote que termina com o caractere de nova linha,outputfile.txt
é o arquivo para o qual a saída será redirecionada).No Mathematica v.> = 6, o MathKernel possui uma opção de linha de comando não documentada:
que controla se o MathKernel terá um ícone visível na barra de tarefas (pelo menos no Windows).
O FrontEnd (pelo menos da v.5) tem opção de linha de comando não documentada
que desativa a tela inicial e permite executar o Mathematica FrontEnd muito mais rapidamente
e opção
que desativa o mecanismo que inicia a versão mais recente do Mathematica instalada em vez de iniciar a versão associada aos arquivos .nb no registro do sistema.
Outra maneira de fazer isso provavelmente é :
É útil combinar a última opção de linha de comando com a configuração da opção global FrontEnd,
VersionedPreferences->True
que desativa o compartilhamento de preferências entre as diferentes versões do Mathematica instaladas :(O item acima deve ser avaliado na versão mais recente do Mathematica instalada.)
No Mathematica 8, isso é controlado na caixa de diálogo Preferências, no painel Sistema, na configuração "Criar e manter preferências de front end específicas da versão" .
É possível obter uma lista incompleta de opções de linha de comando do FrontEnd usando chave não documentada
-h
(o código para Windows):dá:
Outras opções incluem:
Existem outras opções de linha de comando potencialmente úteis do MathKernel e do FrontEnd? Por favor, compartilhe se você souber.
Pergunta relacionada .
fonte
-32
e significa que a versão do MathKernel usada pelo FrontEnd corresponderá à versão do sistema operacional (64 bits). Parece que em outros casos essa opção não muda nada.Meus hacks favoritos são pequenas macros geradoras de código que permitem substituir vários comandos padrão do clichê por um curto. Como alternativa, você pode criar comandos para abrir / criar blocos de anotações.
Aqui está o que eu tenho usado há algum tempo no meu fluxo de trabalho diário do Mathematica. Eu me vi fazendo o seguinte:
Fazer tudo isso repetidamente é uma dor, então vamos automatizar! Primeiro, algum código de utilitário:
Agora, vamos criar uma macro que irá colocar as seguintes células no bloco de anotações:
E aqui está a macro:
Agora, quando digito,
MyPrivatize[]
cria o contexto privado e carrega meu pacote padrão. Agora, vamos criar um comando que abrirá um novo bloco de anotações de rascunho com seu próprio contexto privado (para que você possa invadir lá com abandono sem o risco de estragar as definições), mas tenha acesso aos seus contextos atuais.O legal disso é que
SelfDestruct
, quando o comando é executado, não deixa vestígios no bloco de anotações atual - o que é bom, porque, caso contrário, apenas criaria confusão.Para obter pontos de estilo extras, você pode criar acionadores de palavras-chave para essas macros usando
InputAutoReplacements
, mas deixarei isso como um exercício para o leitor.fonte
PutAppend com PageWidth -> Infinito
No Mathematica, o uso do
PutAppend
comando é a maneira mais direta de manter um arquivo de log em execução com resultados de cálculos intermediários. Mas ele usa comoPageWith->78
configuração padrão ao exportar expressões para um arquivo e, portanto, não há garantia de que toda saída intermediária ocupe apenas uma linha no log.PutAppend
não possui nenhuma opção em si, mas o rastreamento de suas avaliações revela que se baseia naOpenAppend
função que possui aPageWith
opção e permite alterar seu valor padrão peloSetOptions
comando:Assim, podemos
PutAppend
acrescentar apenas uma linha por vez, definindo:ATUALIZAR
Há um bug introduzido na versão 10 (corrigido na versão 11.3):
SetOptions
não afeta mais o comportamento deOpenWrite
eOpenAppend
.Uma solução alternativa é implementar sua própria versão
PutAppend
com aPageWidth -> Infinity
opção explícita :Observe que também podemos implementá-lo via
WriteString
como mostrado nesta resposta, mas, neste caso, será necessário converter preliminarmente a expressão naInputForm
via correspondenteToString[expr, InputForm]
.fonte
Eu estava apenas olhando através de um dos meus pacotes para inclusão na presente, e encontrou algumas mensagens que eu definido que maravilhas:
Debug::<some name>
. Por padrão, eles estão desativados, portanto, não produza muita sobrecarga. No entanto, posso agrupar meu código com eles e ativá-los se precisar descobrir exatamente como um pouco de código está se comportando.fonte
Debug
nemTrace
funções; é um conjunto de mensagens que criei com as quais posso jogar meu código para ativar / desativar à vontade. Eles são precedidos pela palavraDebug
, da mesma maneira que umausage
mensagem é precedida pelo nome da função. Ele fornece a mesma funcionalidade que colocar váriascout
instruções no código c ++.Uma das coisas que me incomoda sobre as construções de escopo internas é que elas avaliam todas as definições de variáveis locais de uma só vez, para que você não possa escrever, por exemplo.
Há pouco tempo, criei uma macro chamada WithNest que permite que você faça isso. Acho útil, pois permite manter ligações variáveis locais sem precisar fazer algo como
No final, a melhor maneira de encontrar isso foi usando um símbolo especial para facilitar a repetição da lista de ligações, e coloquei a definição em seu próprio pacote para ocultar esse símbolo. Talvez alguém tenha uma solução mais simples para esse problema?
Se você quiser experimentar, coloque o seguinte em um arquivo chamado
Scoping.m
:fonte
Este foi escrito por Alberto Di Lullo, (que não parece estar no Stack Overflow).
CopyToClipboard
, para o Mathematica 7 (no Mathematica 8 está embutido)Post original: http://forums.wolfram.com/mathgroup/archive/2010/Jun/msg00148.html
Eu achei essa rotina útil para copiar grandes números reais para a área de transferência na forma decimal comum. Por exemplo
CopyToClipboard["123456789.12345"]
Cell[OutputFormData@expr]
remove as aspas ordenadamente.fonte
Esse código cria uma paleta que carrega a seleção no Stack Exchange como uma imagem. No Windows, é fornecido um botão extra que fornece uma renderização mais fiel da seleção.
Copie o código em uma célula do notebook e avalie. Em seguida, retire a paleta da saída e instale-a usando
Palettes -> Install Palette...
Se você tiver algum problema, poste um comentário aqui. Faça o download da versão do notebook aqui .
fonte
Tenho certeza de que muitas pessoas encontraram a situação em que executam algumas coisas, percebendo que não apenas travaram o programa, mas também não salvaram nos últimos 10 minutos!
EDITAR
Depois de sofrer com isso por algum tempo, um dia descobri que é possível criar um salvamento automático a partir do código do Mathematica . Penso que o uso desse salvamento automático me ajudou muito no passado, e sempre achei que a possibilidade em si era algo que poucas pessoas sabem que podem fazer.
O código original que usei está na parte inferior. Graças aos comentários, descobri que é problemático e é muito melhor fazê-lo de uma maneira alternativa, usando
ScheduledTask
(que funcionará apenas no Mathematica 8).O código para isso pode ser encontrado nesta resposta em
Sjoerd C. de Vries
(Como não tenho certeza se é bom copiá-lo para aqui, estou deixando-o apenas como um link.)A solução abaixo está usando
Dynamic
. Ele salvará o notebook a cada 60 segundos, mas aparentemente apenas se sua célula estiver visível . Estou deixando aqui apenas por motivos de conclusão. (e para usuários do Mathematica 6 e 7)/EDITAR
Para resolvê-lo, eu uso esse código no início de um notebook:
Isso salvará seu trabalho a cada 60 segundos.
Eu prefiro
NotebookAutoSave[]
porque salva antes de a entrada ser processada e porque alguns arquivos são mais texto do que entrada.Encontrei-o aqui originalmente: http://en.wikipedia.org/wiki/Talk:Mathematica#Criticisms
Observe que, ao executar esta linha, o salvamento ocorrerá mesmo que você feche e abra novamente o arquivo (desde que a atualização dinâmica esteja ativada).
Além disso, como não há desfazer no Mathematica , tome cuidado para não excluir todo o seu conteúdo, pois o salvamento o tornará irreversível (como medida de precaução, removo esse código de todos os blocos de anotações concluídos)
fonte
NotebookSave[SelectedNotebook[], "work-" <> IntegerString[i] <> ".nb"]; i++
, mas acho que qualquer tipo de referência ao nome atual do notebook se tornará recursivo.Dynamic
objetos só são atualizados quando estão visíveis, então não tenho certeza se esse método funcionaria se, por exemplo, você rolar oDynamic
objeto para fora da área visível. Então, novamente, eu não tentei. De qualquer forma, eu apenas a ofereci como sugestão.Dynamic[Refresh[i++, UpdateInterval -> 1, TrackedSymbols -> {}]]
. Role o número incremental de vista, espere um minuto, role para trás e veja se o número não é incrementado em 60. SobreUpdateInterval
: isso geralmente é usado se possível, mas se o seu código incluir variáveis que mudam, essa alteração aciona uma nova atualização antes do intervalo termina. Experimente a linha acima semTrackedSymbols
Lembre-se de que o Mathematica Book também está disponível on-line em http://reference.wolfram.com/legacy/v5_2/ - embora seja substituído pela documentação atual em http://reference.wolfram.com
fonte
Acho realmente útil ao desenvolver pacotes para adicionar esse atalho de teclado ao meu
SystemFiles/FrontEnd/TextResources/Windows/KeyEventTranslations.tr
arquivo.Em seguida,
Packagename.m
faço cadaPackagenameTest.nb
bloco de notas para teste e as duas primeiras células do bloco de notas são definidas como células de inicialização. Na primeira célula eu coloqueipara carregar a biblioteca PackageManipulations, muito útil, que foi escrita por Leonid. A segunda célula contém
que todos realizam o recarregamento real do pacote. Observe que as duas primeiras linhas existem apenas para
Remove
todos os símbolos, pois eu gosto de manter os contextos o mais limpos possível.Em seguida, o fluxo de trabalho para escrever e testar um pacote se torna algo assim.
Packagename.m
.PackagenameTest.nb
e façaCTRL + ALT + i
.Isso faz com que as células de inicialização recarregem o pacote, o que torna o teste muito simples.
fonte
A função a seguir
format[expr_]
pode ser usada para recuar / formatarmathematica
expressões não formatadas que se estendem por uma páginaref: /codegolf/3088/indent-a-string-using-given-parentheses
fonte
format@RandomInteger[10,{3,3}]
): pastebin.com/nUT54Emq Como você já possui o básico e está interessado nisso, você pode melhorar o código para produzir uma formatação de fácil leitura? O próximo passo seria criar um botão de colar que criará uma célula de entrada com o código Mathematica bem recuado (de preferência preservando os comentários !!) Veja também minha pergunta relacionada .