Mathematica Downvalue Lhs - PullRequest
       7

Mathematica Downvalue Lhs

10 голосов
/ 25 сентября 2008

Кто-нибудь знает, есть ли в Mathematica встроенная функция для получения lhs правил снижения стоимости (без удержания)? Я знаю, как написать код, чтобы сделать это, но он кажется достаточно базовым для встроенного

Например:

a[1]=2;
a[2]=3;

BuiltInIDoNotKnowOf[a] возврат {1,2}

Ответы [ 2 ]

22 голосов
/ 30 сентября 2008

Это похоже на keys() в Perl, Python и других языках, которые имеют встроенную поддержку хэшей (словари). Как показывает ваш пример, Mathematica поддерживает хеши без какого-либо специального синтаксиса. Просто скажите a[1] = 2 и у вас есть хеш. [1] Чтобы получить ключи хеша, я рекомендую добавить это в вашу init.m или вашу личную библиотеку утилит:

keys[f_] := DownValues[f][[All,1,1,1]]  (* Keys of a hash/dictionary. *)

(Или следующая чистая версия функции предположительно немного быстрее:

keys = DownValues[#][[All,1,1,1]]&;     (* Keys of a hash/dictionary. *)

)

В любом случае, keys[a] теперь возвращает то, что вы хотите. (Вы можете получить значения хеша с помощью a /@ keys[a].) Если вы хотите разрешить хэши с более высокой арностью, например a[1,2]=5; a[3,4]=6, тогда вы можете использовать это:

SetAttributes[removeHead, {HoldAll}];
removeHead[h_[args___]] := {args}
keys[f_] := removeHead @@@ DownValues[f][[All,1]]

Что возвращает {{1,2}, {3,4}}. (В этом случае вы можете получить значения хеша с помощью a @@@ keys[a].)

Обратите внимание, что DownValues по умолчанию сортирует ключи, что, вероятно, не очень хорошая идея, так как в лучшем случае это занимает дополнительное время. Если вы хотите отсортировать ключи, просто наберите Sort@keys[f]. Поэтому я бы порекомендовал эту версию:

keys = DownValues[#,Sort->False][[All,1,1,1]]&;

Интересно, что в документации DownValues нет упоминания о опции Sort. Я узнал об этом из старого поста Даниэля Лихтблау из Wolfram Research. (Я подтвердил, что он все еще работает в текущей версии (7.0) Mathematica.)

<Ч />

Сноска:

[1] Что действительно удобно, так это то, что вы можете смешивать и сопоставлять это с определениями функций. Как:

fib[0] = 1;
fib[1] = 1;
fib[n_] := fib[n-1] + fib[n-2]

Затем вы можете добавить памятку, изменив эту последнюю строку на

fib[n_] := fib[n] = fib[n-1] + fib[n-2]

, который говорит, что нужно кэшировать ответ для всех последующих вызовов.

9 голосов
/ 26 сентября 2008

Это похоже на работу; не уверен, насколько это полезно:

a[1] = 2
a[2] = 3
a[3] = 5
a[6] = 8
Part[DownValues[a], All, 1, 1, 1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...