【问题标题】:Handling flexible arguments in Mathematica functions在 Mathematica 函数中处理灵活的参数
【发布时间】:2012-01-21 05:01:24
【问题描述】:

这是一个分支和扩展:Is it safe to turn off Pattern::patv?

许多内置 Mathematica 函数允许灵活的参数。在用户定义的函数中,我一直在使用 Alternatives 来实现此目的,但是 cmets 和对所引用问题的回答表明这至少是非标准的,并且可能是不可取的。

让我定义一个虚拟函数foo 为例。

Off[Pattern::patv]

p = {_?NumericQ, _?NumericQ};

foo[
  {x : p ..} | x : p,
  {y__} | y__,
  ops : OptionsPattern[]
] /; Max[y] <= 10  :=  bar[#, y, ops] & /@ {x}

foo 接受,按顺序:

  • 与模式p 匹配的对象,或此类对象的列表。
  • 一组最大值为 10 的隐式数字对象,可以是一个列表或一系列参数(这些对象本身可以是最大值为 10 的数字列表)
  • 选项匹配OptionsPattern[]

如果不满足这些条件中的任何一个,foo[args] 将不经计算返回。

使用Alternatives (|) 的两种模式是最常见的情况,但它们并不排斥。

我很难知道应该如何最好地实施foo

  • 实现此目的的规范方法是什么?

  • 与使用Alternatives相比有什么优势?

  • 客观上更容易阅读吗?

【问题讨论】:

    标签: wolfram-mathematica arguments user-defined-functions


    【解决方案1】:

    我认为处理灵活参数的规范方法有以下三种:

    1. 一切顺利:f[x_],
    2. 多种形式:f[{x : p ..}]f[x:p],其中一个调用另一个,并且
    3. 替代:f[{x : p ..} | x : p]

    主要区别在于您处理灵活参数的附加复杂性。各有各的优点。

    任何东西的主要优点是创建可接受模式的简单性,但这将处理留给函数内部,这增加了它的复杂性。请参阅 ErrorBarPlots .m 文件以获得一个很好的例子。但最终,ErrorListPlot 依赖于隐藏在第一种方法的外观后面的第二种方法。

    多表单方法将复杂性推给调度程序以选择正确的替代方案。它具有最简单的功能形式,因为一种形式通常调用具有“正确”数据布局的另一种形式。这种方法的难点在于函数规范随着具有备选方案的参数数量的指数增长。这可以通过采用混合方法来限制,例如 ErrorListPlot 中的方法。

    Alternation 具有最复杂的模式形式,并且可能需要特殊处理来提取与任何情况类似的替代方案。此外,模式本身可能更难以构建,并且由于可能进行额外处理,因此在这三种方法中应该最少使用此方法。但是,在某些情况下,例如在您的代码中,此方法可能是最直接的实现。

    【讨论】:

    • 感谢您的回答。请包含一些代码示例,特别是您将如何实现“如果不满足任何这些条件,则返回未评估的 foo[args]。”使用方法 1. 和 2.(我知道 Leonid 的方法,但您使用的是这种方法吗?)
    • @Mr.Wizard,给我几个小时。我在脑海中写下了这个,并没有充实任何代码示例。
    猜你喜欢
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2019-09-19
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多