После игры с символическими и численными возможностями Mathematica я считаю, что это хороший язык программирования. Однако то, что делает его менее привлекательным как язык общего назначения, - это отсутствие типа данных типа C (типа записи, как известно в Паскале). Как я могу обойти эту проблему?Тип данных структуры в Mathematica?
ответ
Если я правильно понимаю ваш вопрос, вы можете просто написать что-то вроде этого:
x[foo] = bar x[bar] = baz x[1] = 7 x[7] = 1 ?x
Тогда для доступа к данным для любого конкретного индекса просто введите тот же (например, x[1]
вернется 7
, x[foo]
вернется bar
).
Update: Mathematica 10 представила Association
, который имеет многие из наиболее важных свойств struct
. (См. new answer.) Оригинальная, несколько устаревшая версия этого ответа приведена ниже.
Вы можете использовать Mathematica правила списки, чтобы имитировать тип данных структуры C-подобный. Например,:.
person = {firstName -> "John", lastName -> "Doe"}
Вы можете получить доступ к полей записи с помощью оператора /.
:
firstName /. person
дает John
.
lastName /. person
Doe
.
Чтобы обновить поле записи, снабдите обновленное поле в списке:
PrependTo[person , firstName -> "Jane"]
firstName /. person
затем дает Jane
.
Также см. Mathematica документация на transformation rules.
Выполнение нескольких изменений с использованием предваряющего означает, что в списке лиц появится ряд неиспользуемых правил. Не очень эффективно. –
Обратите внимание, что Mathematica 10 представила ['Association'] (http://reference.wolfram.com/language/ref/Association.html), который имеет многие из самых важных свойств' struct'. См. [Новый ответ] (http://stackoverflow.com/a/33465106/330202). –
Этот способ может работать:
x[foo] = bar
x[bar] = baz
x[1] = 7
x[7] = 1
x[c] = {{1,2,3},{4,5,6}}
, а также для изменения элементов поля списка вы можете так следующее:
x[c] = ReplacePart[x[c], {1, 1} -> 8]
, которая возвращает:
x[c] = {{8,2,3},{4,5,6}}
Mathematica 10 ввел Association
, который имеет многие из наиболее важных свойств 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
Для получения дополнительной информации см
Association
DataSet
(который строит наAssociation
)- Wolfram руководства: Elementary introduction to DataSets и Fast introduction for programmers.
- Mathematica.SE вопросы: How to make use of Associations и Struct equivalent in Mathematica?
- This HackerNews comment.
- 1. Тип структуры данных
- 2. Кэширование данных в Mathematica
- 3. Unallocated тип данных в выделенной структуры
- 4. Тип структуры в C
- 5. Тип данных MPI для структуры массивов
- 6. Какой тип структуры данных Firebase лучше?
- 7. Какой тип структуры таблицы базы данных называется?
- 8. Определить тип generic/variable для структуры данных
- 9. Что такое тип данных имени структуры
- 10. Objective-C Как вернуть тип данных структуры?
- 11. Форматирование выходных данных Mathematica
- 12. Получение рефлексии. Тип структуры
- 13. Тип литья структуры в int
- 14. Конфликтующие тип структуры в с
- 15. неоднозначность соответствующий тип в структуры
- 16. Тип проверки структуры
- 17. Тип структуры immtable
- 18. массив данных-структуры (и) тип данных массива, как понимать разницу
- 19. Экспорт данных из скрипта mathematica
- 20. Структуры структуры данных RESTful
- 21. Попытка распечатать тип данных структуры, инкапсулированной в другую структуру
- 22. MemberQ в Mathematica
- 23. Импорт данных из TXT в Mathematica
- 24. Добавление третьего столбца данных в Mathematica
- 25. ListPlot С двумя наборов данных в Mathematica
- 26. Запись исходного файла данных в Mathematica
- 27. Как импортировать базу данных sqlite в mathematica
- 28. Удерживать тип в поле структуры Golang
- 29. Структуры данных в базах данных
- 30. Надежная очистка в Mathematica
Этот способ ведения дел имеет одно реальное преимущество над подходным принципом, предложенным сакрай: он позволяет вам мутировать «поля» «структуры» простым способом. – Pillsy
Проблема с ответом: если «поле» - это список, его элементы не могут быть изменены индивидуально. Например, x [foo] = {1,2}; x [foo] [[1]] = 3 (* попытка изменить элемент списка *) приведет к ошибке, так как x [foo] не является Lvalue. Таким образом, он все еще не полностью заменяет функциональность C struct. – felix
Вам нужно полностью заменить старое значение, а не просто изменить одно значение списка: f ["foo"] = {1, 2}; f ["foo"] = (ReplacePart [f ["foo"], 1 -> 3]) Кроме того, я бы использовал строки или целые числа для ключей, а не символов. Есть также несколько сложных задач, которые вы можете сделать, установив UpValues для Set. –