【问题标题】:Define Custom Notation in Mathematica在 Mathematica 中定义自定义符号
【发布时间】:2010-11-16 03:02:07
【问题描述】:

我经常需要提取以将值列表限制为子列表,即如果vals 给出vars={x1,x2,x3,x4} 的值,而我需要svars={x2,x4} 的值,我会使用restrict[list,vars,svars] where

restrict[vars_, svars_, vals_] := 
 Extract[vals, Flatten[Position[vars, #] & /@ svars, 1]]

我想提高代码的可读性,或许可以通过为restrict[vars,svars,vals] 定义以下自定义符号


(来源:yaroslavvb.com

我的问题是

  1. 有什么好的方法来实现这个?
  2. 这完全是个好主意吗?

【问题讨论】:

    标签: wolfram-mathematica


    【解决方案1】:

    良好的符号可能非常有用 - 但我不确定是否需要这个特定的符号...

    也就是说,Notation 包使这非常容易。由于使用 Notation 调色板时隐藏的框很多,我将使用截图:

    您可以使用Action -> PrintNotationRules 选项查看底层的NotationMake* downvalues 构造。在[4]中截图生成

    NotationMakeExpression[
      SubscriptBox[vals_, RowBox[{vars_, "|", svars_}]], StandardForm] := 
     MakeExpression[
      RowBox[{"restrict", "[", RowBox[{vars, ",", svars, ",", vals}], 
        "]"}], StandardForm]
    
    NotationMakeBoxes[Subscript[vals_, vars_ | svars_], StandardForm] := 
     SubscriptBox[MakeBoxes[vals, StandardForm], 
      RowBox[{Parenthesize[vars, StandardForm, Alternatives], "|", 
        Parenthesize[svars, StandardForm, Alternatives]}]]
    

    【讨论】:

    • 相关问题,如何进入 Notation Palette?我在其中一个教程中找到了指向它的链接,但它不在我的调色板菜单中
    • 提供NotationAutoLoadNotationPalette == True`它应该在你Need["Notation'"]时自动打开。如果没有,您可以从ToFileName[{$InstallationDirectory, "AddOns", "Packages", "Notation", "LocalPalettes", "English"}, ""] 打开它和/或从调色板菜单安装它。
    【解决方案2】:

    关于 2:我会通过规则列表 Thread[vars -> vals] 而不是分别跟踪名称和值。
    我最喜欢的 Mathematica 习惯用法之一是将规则列表与 WithRules 一起使用,定义如下:此构造计算 With 块中的表达式,其中所有替换符号都已(递归定义)。这让你可以做类似的事情

    WithRules[{a -> 1, b -> 2 a + 1}, b]
    

    并让您对命名参数走得很远。

    SetAttributes[WithRules, HoldRest]
    WithRules[rules_, expr_] := Module[{notSet}, Quiet[
         With[{args = Reverse[rules /. Rule[a_, b_] -> notSet[a, b]]},
           Fold[With[{#2}, #1] &, expr, args]] /. notSet -> Set, 
       With::lvw]]
    

    编辑:WithRules 构造基于这两个 usenet 线程(感谢 Simon 挖掘它们):

    【讨论】:

    • 用法与stackoverflow.com/questions/4152194/… 类似。 IE,我将 f1(x1,x2)*f2(x2,x3) 与 x1,x2,x3 相加,其中 fi 的参数存储在 args[fi]
    • 好的,所以这可能不是那么有用。尽管如此,这是我最喜欢的把戏,所以任何借口都可以发布它:)
    • 这是一个不错的技巧。我记得在this mathgroup post 中讨论过类似的方法。
    • 还有this one(这是我记得的实际讨论!)
    • @Simon:是的,没错!感谢您找到它们(我快速尝试了一下,但没有运气)。已添加指向我的答案的链接以供将来参考。
    猜你喜欢
    • 1970-01-01
    • 2019-01-29
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多