我经常需要提取以将值列表限制为子列表,即如果vals
给出vars={x1,x2,x3,x4}
的值,并且我需要值svars={x2,x4}
我会restrict[list,vars,svars]
其中< / p>
restrict[vars_, svars_, vals_] :=
Extract[vals, Flatten[Position[vars, #] & /@ svars, 1]]
我希望通过为restrict[vars,svars,vals]
定义以下自定义表示法来提高代码可读性
http://yaroslavvb.com/upload/custom-notation.png
我的问题是
答案 0 :(得分:4)
好的符号可能非常有用 - 但我不确定是否需要这个特殊的符号...
也就是说,Notation
包让这很容易。由于使用表示法调色板时有许多隐藏框,我将使用屏幕截图:
您可以使用NotationMake*
选项查看基础Action -> PrintNotationRules
下行值构造。在[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]}]]
答案 1 :(得分:3)
关于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挖掘它们):