2008-09-25 7 views
10

(아무런 지장없이) 다운 타임 규칙의 lh를 얻기위한 Mathematica에 내장 함수가 있는지 아는 사람 있습니까? 나는 그것을 할 수있는 코드를 작성하는 방법을 알고 있지만, 내장 예를 들어Mathematica Downvalue Lhs

충분한 기본 같다 :이 작동하는 것 같다

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

BuiltInIDoNotKnowOf[a] 반환 {1,2}

답변

9

; 확실하지가 있지만, 어떻게 유용

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

그래, [[]] 표기법과 비슷한 것을 시도했지만 보류를 해제하고 rhs를 얻을 수 있습니다. 그러나 이것은 위대한 작품! –

+0

DownValues ​​[a] [[All, 1, 1, 1]]처럼 보입니다.이 간단한 예에서 적어도 작동합니다. –

22

이 펄과 파이썬과 해시 (일명 사전)를 지원하는 기능이 내장되어있다 다른 언어 keys() 같다. 예제처럼 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은 키를 정렬하므로 기껏해야 추가 시간이 소요되므로 키를 정렬하는 것이 좋습니다. 키를 정렬하려면 [email protected][f]을 사용해도됩니다. 그래서 사실은이 버전을 추천 할 것입니다 :

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

는 흥미롭게도, DownValues documention에서 Sort 옵션에 대한 언급이 없다. Wolfram Research의 다니엘 리치 블라 우 (Daniel Lichtblau)가 쓴 오래된 글에서 알게되었습니다. (나는 여전히 티카의 현재 버전 (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] 

에 마지막 라인을 변경하여 메모이 제이션을 추가 할 수 있습니다.