Mathematica Понижение стоимости в латах
-
02-07-2019 - |
Вопрос
Кто-нибудь знает, есть ли в Mathematica встроенная функция для получения левых правил понижения стоимости (без какого-либо удержания)?Я знаю, как написать код для этого, но он кажется достаточно простым для встроенного
Например:
a[1]=2;
a[2]=3;
BuiltInIDoNotKnowOf[a]
возвращает {1,2}
Решение
Кажется, это работает;хотя не уверен, насколько это полезно:
a[1] = 2
a[2] = 3
a[3] = 5
a[6] = 8
Part[DownValues[a], All, 1, 1, 1]
Другие советы
Это как 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]]&;
Интересно, что нет никаких упоминаний о Sort
вариант в DownValues
документация.Я узнал об этом из старого поста Дэниела Лихтблау из Wolfram Research.(Я подтвердил, что это все еще работает в текущей версии Mathematica (7.0).)
Сноски:
[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]
в котором говорится кэшировать ответ для всех последующих вызовов.