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中,因此有各种各样的特殊技巧,您无法使用,而/开关。(参见文档中的默认值
,可选
,选项模式
,选项值
,异常
,等等)