2008-09-25 19 views
10

Mathematica'da geçersiz kılma kurallarının (herhangi bir bekletme olmaksızın) elde edilmesi için yerleşik bir işlev olup olmadığını bilen var mı? Bunu yapmak için kod yazma bilen fakat bir dahili ÖrneğinMathematica Downvalue Lhs

için yeterli temel görünüyor: Bu iş gibi görünüyor

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

BuiltInIDoNotKnowOf[a] getiri {1,2}

cevap

9

; Emin olsa, ne kadar yararlıdır:

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

Evet, [[]] notasyonuna benzer bir şey yapmayı denedim, ancak tutmayı kapattı ve rhs'yi alırdım. Ama bu harika çalışıyor! –

+0

DownValues ​​[a] [[All, 1, 1, 1]] gibi görünüyor, en azından bu basit örnekte çalışıyor. –

22

Bu Perl ve Python ve sağlamalarının (aka sözlükler) desteği yerleşik diğer dillerde keys() gibidir. Örneğinizin de gösterdiği gibi, Mathematica herhangi bir özel sözdizimi olmayan karmaları desteklemektedir. Sadece a[1] = 2 deyin ve bir hashınız var. [1] karmasının bir anahtarlarını almak için, ben senin init.m veya kişisel yardımcı programları kütüphanesine bu eklemenizi öneririz:

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

(Ya aşağıdaki saf fonksiyon versiyonu biraz daha hızlı olduğu iddia ediliyor:

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

)

iki şekilde de, keys[a] şimdi istediğini döndürür. (Sen a /@ keys[a] ile karma değerlerini elde edebilirsiniz.) Daha yüksek Arity karmaları için izin vermek istiyorsanız, a[1,2]=5; a[3,4]=6 o zaman bunu kullanabilirsiniz gibi:

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

{{1,2}, {3,4}} döndürür hangisi. (Bu durumda, a @@@ keys[a] ile karma değerler alabilirsiniz.)

Varsayılan olarak, DownValues anahtarının anahtarları sıraladığını unutmayın; bu, muhtemelen en iyi zamanın geçmesi nedeniyle iyi bir fikir değildir. Anahtarların sıralanmasını istiyorsanız sadece [email protected][f] yapabilirsiniz. Bu yüzden bu sürümü öneriyoruz:

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

İlginç DownValues documention içinde Sort seçeneği söz edilmemektedir. Wolfram Research'ten Daniel Lichtblau'nun eski bir yazısından öğrendim. (Ben hala Mathematica'nın güncel sürümü (7.0) 'de çalıştığını doğruladı.)


Dipnotlar:

[1] Gerçekten kullanışlı karıştırıp işlev tanımlarıyla birlikte eşleşmesi olabilir. Gibi:

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

Ardından sonraki tüm aramalar için cevap önbelleğe diyor

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

bu son satırı değiştirerek Memoization ekleyebilir.

İlgili konular