2011-08-01 2 views
1

저는 Mathematica에서 작은 mathlink 모듈을 통해 사용하고있는 Fortran으로 작성된 스칼라 함수를 가지고 있습니다. 이 함수가 기호 상수의 처리를 포함하여 가능하면 네이티브 Mathematica 함수에 가깝게 동작하기를 바랍니다.Mathlink와 지연 평가/변수

대용량 기호/변수를 대체 규칙의 목록으로 바꾸는 mathematica에 표현식을 쓰고 싶습니다. 그러나 Mathematica는 심볼릭 인자가있는 제 mathlink 함수를 즉시 평가하려고 시도하는데 분명히 실패합니다. 예를 들어, 심지어 다음과 같은 간단한 식을

extf[a]/.a->5 

모든 상징적 인 인수가 숫자로 대체 될 때까지 함수의 평가를 지연 할 수있는 방법이 있나요 실패 할 것인가?

일부 성공적인 방법으로 사용하지 못했지만 (동료와 공유 할 일반 목적의 mathematica 패키지에이 함수를 포함하려는 경우 허용되지 않음) 외부에 대한 "더미"참조로 모든 것을 평가하는 것입니다 함수를 호출 한 다음 대체 규칙을 사용하여 실제 참조에 대한 모든 더미 참조를 바꿔서 동시에 다른 모든 상수를 평가합니다. 예 :

+0

어떤 종류의 인수 패턴을 사용 했습니까? 인수 패턴이 일치하지 않으면 함수는 평가되지 않은 값을 리턴합니다. 그 순간에 교체가 시작되어야하며 함수는 수치 인수로 평가되어야합니다. –

답변

4

Mathematica 패턴 매처를 사용하는 것이 유용할까요? 입력이 숫자가 아닌 경우 holddummyf에 대한 정의를 생략해야합니다.

dummyf[a_?NumericQ] := extf[a] 
holddummyf[a_?NumericQ] := extf[a] 
dummyf[a_] := holddummyf[a] 

[In] dummyf[0.3] 
[Out] extf[0.3] 

[In] dummyf[b] 
[Out] holddummyf[b] 

[In] % /. b -> 5 
[Out] extf[5] 

나는 물어 다른 질문은 포트란에서 extf을 갖는 것은 꼭 필요 여부 것 같다.

+4

'holddummyf' 물건이 전혀 필요 없다고 생각합니다. 그것을 쓰지 않으면'dummyf'는 인수가 숫자가 아닌 경우 평가되지 않은 값을 반환합니다. –

+0

완벽하게 작동합니다. 이전에 매개 변수에 패턴 매칭을 사용하지 않았으며 Mathematica가이 기능을 가지고 있다는 것을 알지 못했습니다. extf는 Python 라이브러리 (복잡한 오류 함수를 계산하기위한 최적화 된 수치 루틴)에서 가져온 것으로 Mathematica로 작성 될 수 있지만 더 많은 시간이 걸릴 수 있으며 코드 최적화를 위해 드롭 인 최적화 된 함수를 원합니다. 단기적으로. – crasic

+0

@ 브렛, 좋은 지적. 나는 원래 그가 dummyf [a_]에 대한 일반적인 정의를 가지고 싶다고 생각했다. 그 정의는 정의되지 않은 채로 남겨 두는 트릭을 사용하는 것이 아니기 때문에 정의되지 않은 다른 것이 필요하다. 그 때 무슨 일이 일어나는지 명확 해집니다. 하지만 내 대답을 편집 할 수 있습니다. – Verbeia