1

の使用に問題がありますWhich。引数の 1 つ ( ) が(または のいずれか)arg2であると想定されるMathematica で関数を作成しています。関数の出力をこのように依存させたいのですが、うまくいきません:SymbolNoneFullarg2

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

is の場合arg2None問題ないようですが、isarg2の場合は自分自身を返すだけです。記号やの代わりに実数または整数を使用すると、正しく機能します。FulltestFunctionNoneFulltestFunction

テストでの記号の使用は間違っていますか? Whichまたは、記号と記号を一緒に使用するときに知っておくべき他の「ルール」はありますか?

私はすでにこのサイトや他のサイトで答えを探していますが、見つかりませんでした。Mathematica のヘルプ ファイルにも答えはありませんでした。どこを見ても、魔女のシンボルは使われていません。

4

2 に答える 2

5

解決策は、 (演算子) の代わりに (つまり、演算子)をSameQ使用することです。===Equal==

Equal数学的な平等のためです。 a==bは評価されません。つまり、Mathematica はこれらの変数が同じ値を持つかどうかわからないということです。 1==2に評価されますがFalse、 にa==a評価されTrueます。

SameQは構造的等価性のためのもので、常に toTrueまたは toのいずれかに評価されますFalseTrue比較される式が構造的に等しい場合にのみ評価されます。0 === 0.0数学的な同等性をテストしようとはしないため、たとえばFalse、2 つの式が構造的に異なる (一方は正確な数値で、もう一方は機械精度の数値) となります。

ここでは、評価する必要があるため、構造的等価性が必要です(whileは評価Full === Noneされないままです)。使うだけFalseFull == None

testFunction[arg1_,arg2_:None]:=Which[arg2===None,arg1*2,arg2===Full,arg1*3]
于 2012-05-01T11:28:52.187 に答える
1

使用SameQは解決策ですが、これを構築するためのより良い方法があると思います。 Switch最も直接的な置き換えです:

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

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

多くの場合、Which/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
于 2012-05-01T22:49:56.823 に答える