用一个可选值定义一个函数,该值是mathematica中函数的另一个参数的默认值
我试图定义一个函数,它接受一个矩阵,并且当它的维度不作为输入提供时,在可选参数d
计算这些维度
这不起作用,但给你的想法(选项参数需要是常量):
Options[DimM] = {d -> Dimensions[A]};
DimM[A_?MatrixQ, OptionsPattern[]] := OptionValue@d;
事实上,简单的方法是输入一个不可能的值,并在函数中定义一个if条件
Options[DimM] = {d -> 0};
DimM[A_?MatrixQ, OptionsPattern[]] :=If[OptionValue@d==0,Dimensions[A],OptionValue@d]
我怎样才能最有效地做到这一点?
对于您的原始公式,@WReach给出了一个很好的答案。 但是,重新考虑一下设计可能是有意义的:请注意,在任何情况下,您都有一个d
(取决于输入参数)值。 可选参数是为此设计的 - 可选。 在你的情况下,默认参数似乎更合适。 您可以使用Automatic
设置,与@WReach建议的类似:
dimMAuto[a_?MatrixQ, d_: Automatic] :=
If[d === Automatic, Dimensions[a], d];
要在代码中的多个位置使用它,您需要引入一个辅助变量或常量(使用With
或Module
)来存储此值。 作为替代方案,您还可以使用以下代码:
Module[{dims},
dimM[a_?MatrixQ, d_: dims] :=
Block[{dims = Dimensions[a]},
d]
]
其优点是可以在函数主体中的任何位置使用相同的原始参数d
。 这里发生的事情并不平凡: Module
用于生成一个唯一的符号,然后将其作为d
的默认值并用于动态计算维度。 请注意, Block
不是定义符号dims
,而是由Module
产生的独特符号dims$77542
。 Module
和Block
这种组合使这种技术完全安全。 使用示例:
In[1466]:= dimM[IdentityMatrix[3],{1,1}]
Out[1466]= {1,1}
In[1467]:= dimM[IdentityMatrix[3]]
Out[1467]= {3,3}
我认为Module
和Block
这种组合是一种有趣的技术,可能会发现其他用途。 从本质上讲,它是动态范围界定的一个版本,通过词汇范围界定(或者更确切地说,它在Mathematica中的模仿)是安全的 - 因为动态范围界定的主要危险之一是动态本地化符号与相同名称的无意碰撞。
在一个不相关的问题上 - 最好不要用大写字母来启动变量和函数,因为它们可能会与系统符号相冲突。
这不是对“简单方法”的改进,但对于许多内置的Mathematica函数, Automatic
符号用作“不可能的值”。 例如:
Options[DimM] = {d -> Automatic};
DimM[A_?MatrixQ, OptionsPattern[]] := OptionValue[d] /. Automatic->Dimensions[A]
DimM[RandomInteger[10, {2, 2}]]
(* {2, 2} *)
DimM[RandomInteger[10, {2, 2}], d -> {5, 5}]
(* {5, 5} *)
链接地址: http://www.djcxy.com/p/35529.html