gpt4 book ai didi

wolfram-mathematica - 使用可选值定义一个函数,默认情况下该函数是 mathematica 中函数的另一个参数的函数

转载 作者:行者123 更新时间:2023-12-04 08:17:38 26 4
gpt4 key购买 nike

我试图定义一个接受矩阵的函数,当它的维度没有作为输入提供时,在可选参数 d 中计算这些维度

这不起作用,但给了你一个想法(选项参数需要是常量):

Options[DimM] = {d -> Dimensions[A]};
DimM[A_?MatrixQ, OptionsPattern[]] := OptionValue@d;

事实上,简单的方法是输入一个不可能的值,并在函数 def 中放置一个 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];

要在代码中的多个地方使用它,您需要引入一个辅助变量或常量(使用 WithModule )来存储这个值。作为替代方案,您还可以使用以下代码:
Module[{dims},
dimM[a_?MatrixQ, d_: dims] :=
Block[{dims = Dimensions[a]},
d]
]

其优点是可以使用相同的原始参数 d函数体中的任何地方。这里发生的事情相当重要: Module用于生成唯一符号,然后将其作为 d 的默认值给出。并用于动态计算维度。请注意 Block本地化不是符号 dims ,但独特的符号如 dims$77542制作人 Module .此组合 ModuleBlock使这项技术完全安全。使用示例:
In[1466]:= dimM[IdentityMatrix[3],{1,1}]
Out[1466]= {1,1}

In[1467]:= dimM[IdentityMatrix[3]]
Out[1467]= {3,3}

我觉得这个组合 ModuleBlock是一种有趣的技术,可以找到其他用途。从本质上讲,它是一种通过词法作用域(或者更准确地说,它在 Mathematica 中的模仿)变得安全的动态作用域版本 - 因为动态作用域的主要危险之一是具有相同名称的动态本地化符号的无意冲突。

在一个不相关的问题上 - 最好不要以大写字母开头变量和函数,因为它们可能会与系统符号发生冲突。

关于wolfram-mathematica - 使用可选值定义一个函数,默认情况下该函数是 mathematica 中函数的另一个参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7394113/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com