Wolfram mathematica 将其与基于符号的测试一起使用

Wolfram mathematica 将其与基于符号的测试一起使用,wolfram-mathematica,Wolfram Mathematica,我在使用哪个时遇到问题。我在Mathematica中创建一个函数,其中一个参数(arg2)应该是符号(None或Full)。 我希望函数的输出依赖于如下所示的arg2,但它不起作用: testFunction[arg1_,arg2_:None]:=Which[arg2==None,arg1*2,arg2==Full,arg1*3] 如果arg2为None似乎没有问题,但对于arg2为Full,testFunction只返回自身。 当使用实数或整数代替符号None和Full时,testFunct

我在使用
哪个
时遇到问题。我在Mathematica中创建一个函数,其中一个参数(
arg2
)应该是
符号(
None
Full
)。 我希望函数的输出依赖于如下所示的
arg2
,但它不起作用:

testFunction[arg1_,arg2_:None]:=Which[arg2==None,arg1*2,arg2==Full,arg1*3]
如果
arg2
None
似乎没有问题,但对于
arg2
Full
testFunction
只返回自身。 当使用实数或整数代替符号
None
Full
时,
testFunction
功能正常

我在测试中使用符号是否出错?或者在一起使用
哪些
和符号时,有没有其他我应该注意的“规则”


我已经在这个网站和其他网站上搜索了答案,但没有找到任何答案。Mathematica帮助文件也没有给我提供答案。我到处寻找没有使用巫婆符号的地方。

解决方法是使用
SameQ
(即操作符
===
)而不是
Equal
(操作符
=

是数学等式
a==b
不计算,这意味着Mathematica不知道这些变量是否具有相同的值
1==2
计算结果为
False
,而
a==a
计算结果为
True

表示结构相等,并将始终计算为
True
False
。仅当所比较的表达式在结构上相等时,它才会计算为
True
。它不尝试测试数学等式,因此,例如,
0===0.0
将给出
False
,因为这两个表达式在结构上不同(一个是精确数字,另一个是机器精度)

这里您需要结构相等,因为您需要
Full==None
计算为
False
(而
Full==None
保持未计算)。只用

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

解决方案是使用
SameQ
(即操作符
==
)而不是
Equal
(操作符
=

是数学等式
a==b
不计算,这意味着Mathematica不知道这些变量是否具有相同的值
1==2
计算结果为
False
,而
a==a
计算结果为
True

表示结构相等,并将始终计算为
True
False
。仅当所比较的表达式在结构上相等时,它才会计算为
True
。它不尝试测试数学等式,因此,例如,
0===0.0
将给出
False
,因为这两个表达式在结构上不同(一个是精确数字,另一个是机器精度)

这里您需要结构相等,因为您需要
Full==None
计算为
False
(而
Full==None
保持未计算)。只用

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

虽然使用
SameQ
是一种解决方案,但我认为有更好的方法来构建它<代码>开关
是最直接的替代品:

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

f[7]
f[7, None]
f[7, Full]
通常,最好避免使用哪个/开关等,并使用模式,例如:

ClearAll[f]

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

f[7]
f[7, None]
f[7, Full]

虽然使用
SameQ
是一种解决方案,但我认为有更好的方法来构建它<代码>开关
是最直接的替代品:

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

f[7]
f[7, None]
f[7, Full]
通常,最好避免使用哪个/开关等,并使用模式,例如:

ClearAll[f]

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

f[7]
f[7, None]
f[7, Full]

你们可以把未来的问题贴在上面,以便更快地得到更好的答案。这是一个非常类似的网站,专门研究Mathematica。你们可以在上面发布未来的问题,以便更快地得到更好的答案。这是一个非常类似的网站,专门研究数学。谢谢!这正是我想要的。奇怪的是,我以前没有遇到这种差异,或者我只是忘记了…谢谢!这正是我想要的。奇怪的是,我以前没有遇到这种差异,或者我只是忘记了……谢谢你的回复,巫师先生。为什么最好避免使用哪个/开关?它们比模式慢吗?就我个人而言,我认为这是一种非常简洁的方法,模式会使代码(对我来说)变得不那么清晰。@Pater是的,它们通常会比较慢。举个例子。此外,我个人发现,模式在习惯之后更容易阅读,而且它们最终更灵活,更好地集成到Mathematica中,因此有各种各样的特殊技巧,您无法使用
,而
/
开关
。(请参阅文档中的
默认值
可选值
选项模式
选项值
异常
,等等)感谢您的回复,向导先生。为什么最好避免使用哪个/开关?它们比模式慢吗?就我个人而言,我认为这是一种非常简洁的方法,模式会使代码(对我来说)变得不那么清晰。@Pater是的,它们通常会比较慢。举个例子。此外,我个人发现,模式在习惯之后更容易阅读,而且它们最终更灵活,更好地集成到Mathematica中,因此有各种各样的特殊技巧,您无法使用
,而
/
开关
。(参见文档中的
默认值
可选
选项模式
选项值
异常
,等等)