2008-09-25 16 views
10

Czy ktoś wie, czy istnieje wbudowana funkcja w Mathematica, aby uzyskać reguły obniżania wartości (bez żadnego trzymania)? Wiem, jak napisać kod, aby to zrobić, ale wydaje się dość podstawowy dla wbudowanąMathematica Downvalue Lhs

Na przykład:

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

BuiltInIDoNotKnowOf[a] zwrotów {1,2}

Odpowiedz

9

To wydaje się działać; nie wiem, jak to jest przydatne, choć:

a[1] = 2 
a[2] = 3 
a[3] = 5 
a[6] = 8 
Part[DownValues[a], All, 1, 1, 1] 
+0

Tak, próbowałem zrobić coś podobnego z notacją [[]], ale wyłączyłem blokadę i dostałem rhs. Ale działa to świetnie! –

+0

Wygląda jak DownValues ​​[a] [[Wszystko, 1, 1, 1]] działa również, przynajmniej w tym prostym przykładzie. –

22

To jak keys() w Perlu i Pythonie i innych języków, które mają wbudowane wsparcie dla skrótów (aka słowników). Jak ilustruje Twój przykład, Mathematica obsługuje skróty bez specjalnej składni. Po prostu powiedz a[1] = 2, a otrzymasz hasz. [1] Aby otrzymać klucze mieszania, polecam dodanie tego do swojej init.m lub osobistej użyteczności Biblioteka:

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

(lub po czysta wersja funkcja jest podobno nieco szybciej:

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

)

Tak czy inaczej, keys[a] teraz zwraca to, co chcesz. (Można uzyskać wartości hash z a /@ keys[a]). Jeśli chcesz zezwolić na wyższe mieszań arity, jak a[1,2]=5; a[3,4]=6 następnie można użyć to:

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

Które zwraca {{1,2}, {3,4}}. (W takim przypadku można uzyskać wartości mieszania za pomocą a @@@ keys[a].)

Należy pamiętać, że domyślnie sortuje klucze, co prawdopodobnie nie jest dobrym pomysłem, ponieważ w najlepszym przypadku zajmuje to więcej czasu. Jeśli chcesz posortowane klucze, możesz po prostu zrobić [email protected][f]. Więc chciałbym faktycznie polecam tej wersji:

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

Co ciekawe, nie ma wzmianki o opcji w DownValues dokumentację, Sort. Dowiedziałem się o tym ze starego postu Daniela Lichtblau z Wolfram Research. (I potwierdził, że nadal działa w obecnej wersji (7.0) z Mathematica.)


Przypisy:

[1] Co jest naprawdę poręczny, że można łączyć ze sobą, które z definicji funkcji. Jak:

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

Następnie można dodać memoization zmieniając że ostatni wiersz

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

który mówi buforować odpowiedź dla wszystkich kolejnych połączeń.