2012-05-01 9 views
1

Which을 사용하는 데 문제가 있습니다. 인수 (arg2) 중 하나가 Symbol (None 또는 Full)으로되어있는 Mathematica에서 함수를 만들고 있습니다. 내가이 함수의 결과는이 같은 arg2에 의존하기를 원하지만 그것은 작동하지 않습니다 arg2None 아무 문제 없을 것 같다입니다심볼 기반 테스트에서 어떤 것을 사용합니까?

testFunction[arg1_,arg2_:None]:=Which[arg2==None,arg1*2,arg2==Full,arg1*3] 

경우,하지만 arg2에 대한 Full, testFunction 단지 반환 그 자체. 기호 NoneFull 대신 실제 또는 정수를 사용하는 경우 testFunction이 올바르게 작동합니다.

테스트에서 기호를 사용하여 실수를 했습니까? 또는 Which과 기호를 함께 사용할 때 알아야 할 다른 '규칙'이 있습니까?

이 사이트와 다른 사이트에서 이미 답변을 검색했지만 찾을 수 없습니다. Mathematica 도움말 파일은 나에게도 답을주지 못했습니다. 사방에 나는 마녀 상징을 사용하지 않는 보았다.

+4

[Mathematica.S]에 다음 질문을 게시 할 수 있습니다. E] (http://mathematica.stackexchange.com)를 통해보다 신속하게 답변을 얻을 수 있습니다. Mathematica를 전문으로하는 매우 유사한 사이트입니다. – Szabolcs

답변

5

해결책은 Equal (연산자 ==) 대신 SameQ (즉 연산자 ===)을 사용하는 것입니다.

Equal은 수학적으로 동일합니다. a==b은 평가하지 않습니다. Mathematica는 이러한 변수가 같은 값을 가지고 있는지 여부를 알지 못합니다. 1==2False으로, a==aTrue으로 평가됩니다.

SameQ은 구조적 동일성을 나타내며 항상 True 또는 False 중 하나를 평가합니다. 비교되는 표현식이 구조적으로 같을 경우에만 True으로 평가됩니다. 수학 평등을 시험하려고하지 않습니다. 0 === 0.0은 두 표현식이 구조적으로 다르므로 False을 제공합니다 (하나는 정확한 숫자이고 다른 하나는 기계 정밀도입니다).

여기서 Full === NoneFalse으로 계산되어야하며 (Full == None은 평가되지 않음) 구조적 평등이 필요합니다. 솔루션을 SameQ이다 사용하는 동안 그냥

testFunction[arg1_,arg2_:None]:=Which[arg2===None,arg1*2,arg2===Full,arg1*3] 
+0

고마워요! 그게 바로 제가 찾고 있던 것입니다.이상한 일은 전에이 불일치가 발생하지 않았거나, 아니면 그냥 잊어 버렸습니다. –

1

을 사용하여,이를 구성하는 더 나은 방법이 있다고 생각합니다. Switch는 가장 직접적인 대체 :

ClearAll[f] 

f[arg1_, Full] := arg1*3 
f[arg1_, None | PatternSequence[]] := arg1*2 

f[7] 
f[7, None] 
f[7, Full] 
14 
14 
21 
: 종종

f[arg1_, arg2_: None] := Switch[arg2, None, arg1*2, Full, arg1*3] 

f[7] 
f[7, None] 
f[7, Full] 
14 
14 
21 

은/어떤을 피하기 등의 사용 패턴, 예를 전환하는 것이 가장 좋습니다

+0

답장을 보내 주셔서 감사합니다 Mr. Wizard. 왜/스위치를 피하는 것이 가장 좋습니까? 패턴보다 느린가요? 개인적으로 나는 이것과 같은 일을하는 아주 깔끔한 방법이라고 생각합니다. 패턴은 (나를 위해) 코드를 덜 명확하게 만듭니다. –

+0

@Pater 예, 종종 속도가 느립니다. [읽으십시오] (http://mathematica.stackexchange.com/a/2618/121). 또한 개인적으로 익숙해 지기만하면 패턴을 읽기가 더 쉽습니다. Mathematica *에서 궁극적으로 더 유연하고 잘 통합되었으므로'Which' /'Switch'와 함께 사용할 수없는 다양한 특별한 트릭이 있습니다. . (문서의'Default','Optional','OptionsPattern','OptionValue','UpSet' 등을보세요) –

관련 문제