Dopo aver giocato con le capacità simbolici e numerici di Mathematica, trovo che sia un linguaggio di programmazione decente, troppo. Tuttavia, qualcosa che lo rende meno attraente come linguaggio generico è la mancanza del tipo di dati struct C-like (o il tipo di record come noto in Pascal). Come posso aggirare questo problema?Analizza il tipo di dati in Mathematica?
risposta
Se ho capito bene la tua domanda, si può semplicemente scrivere cose come questa:
x[foo] = bar x[bar] = baz x[1] = 7 x[7] = 1 ?x
Poi per accedere ai dati per qualsiasi indice specifico basta digitare lo stesso (ad esempio, x[1]
tornerà 7
, x[foo]
tornerà bar
).
Aggiornamento: Mathematica 10 ha introdotto Association
, che ha molte delle proprietà più importanti di un struct
. (Vedi new answer.) La versione originale, in qualche modo deprecata, di questa risposta è sotto.
È possibile utilizzare una regolaMathematica elenca per simulare un tipo di dati struct C-like. Per esempio,:.
person = {firstName -> "John", lastName -> "Doe"}
È possibile quindi accedere ai campi del record utilizzando l'operatore /.
:
firstName /. person
cede John
.
lastName /. person
cede Doe
.
per aggiornare un campo di un record, anteporre il campo aggiornato alla lista:
PrependTo[person , firstName -> "Jane"]
firstName /. person
cede poi Jane
.
Vedere anche la documentazione Mathematica su transformation rules.
Apportare alcune modifiche usando la preposizione significa che un numero di regole inutilizzate apparirà nell'elenco delle persone. Non molto efficiente. –
Si noti che Mathematica 10 ha introdotto ['Association'] (http://reference.wolfram.com/language/ref/Association.html), che ha molte delle proprietà più importanti di una' struct'. Vedi [nuova risposta] (http://stackoverflow.com/a/33465106/330202). –
In questo modo può funzionare:
x[foo] = bar
x[bar] = baz
x[1] = 7
x[7] = 1
x[c] = {{1,2,3},{4,5,6}}
e anche per cambiare gli elementi di un campo della lista è possibile quindi il seguente:
x[c] = ReplacePart[x[c], {1, 1} -> 8]
che restituisce:
x[c] = {{8,2,3},{4,5,6}}
Mathematica 10 ha introdotto Association
, che ha molte delle proprietà più importanti di un struct
.
someData = <| "name" -> "Bob", "age" -> 23 |>
In[1]:= someData["name"]
Out[1]= Bob
In[2]:= someData["age"]
Out[2]= 23
In[3]:= someData[[2]]
Out[3]= 23
Per ulteriori informazioni, vedere
Association
DataSet
(che si basa sulAssociation
)- Wolfram guida: Elementary introduction to DataSets e Fast introduction for programmers.
- domande Mathematica.SE: How to make use of Associations e Struct equivalent in Mathematica?
- This HackerNews comment.
- 1. integrazione numerica in mathematica dati due elenchi di dati
- 2. Problema che analizza il testo di valuta nel tipo decimale
- 3. Struttura il tipo di dati in php?
- 4. Importa dati da txt a Mathematica
- 5. Analizza/deserializza dati MTOM/XOP .NET
- 6. Equivalente Sprint in Mathematica?
- 7. mirata Semplificare in Mathematica
- 8. come importare database di sqlite in mathematica
- 9. Utilizzo della memoria di profilatura in Mathematica
- 10. Analizza JSON in ANSI C
- 11. Equazione di Schrodinger in Mathematica
- 12. Integrazione in Mathematica
- 13. Variabili temporanee in Mathematica
- 14. Valutazione asincrona in Mathematica
- 15. Come interrompere il barchart per nascondere le etichette per il valore dei dati 0 in Mathematica?
- 16. Rendimento in Mathematica
- 17. MemberQ in Mathematica
- 18. radicarsi quadrata positiva in Mathematica
- 19. Shadows in mathematica Graphics3D
- 20. Programmazione parallela in Mathematica
- 21. Qual è il tipo di dati "atom"?
- 22. Determina il tipo di dati di una colonna in SQLite
- 23. Modifica il tipo di dati di una colonna in serie
- 24. Ottenere un'immagine Mathematica in Java
- 25. GSON che analizza il campo dinamico JSON
- 26. Mathematica - Taccuino di separazione
- 27. Algoritmo di antialiasing Mathematica
- 28. Analizza una stringa XML in Python
- 29. Selezionare il tipo di dati del campo in postgres
- 30. Qual è il tipo di dati "breve" in C?
Questo modo di fare le cose ha un vantaggio reale rispetto all'approccio regola suggerito da sakra: consente di mutare i "campi" della "struttura" in modo semplice. – Pillsy
C'è un problema con la tua risposta: se un "campo" è una lista, i suoi elementi non possono essere modificati individualmente. Ad esempio, x [foo] = {1,2}; x [foo] [[1]] = 3 (* tentativo di modificare l'elemento di lista *) causerà un errore, perché x [foo] non è un Lvalue. Quindi non sostituisce completamente la funzionalità C struct. – felix
È necessario sostituire completamente il vecchio valore, non solo modificare un singolo valore della lista: f ["foo"] = {1, 2}; f ["foo"] = (ReplacePart [f ["foo"], 1 -> 3]) Inoltre, userei stringhe o interi per le chiavi, non per i simboli. Ci sono anche alcuni affari difficili che puoi fare impostando UpValues per Set. –