Fre*_*ple 8 wolfram-mathematica
例如,对于Mathematica中的内置函数,f,最初f [1]给出{1,2,3},但我想让Mathematica只给出{1,3}.期望一种用于重写 f的简单方法.我不想定义新函数或完全重写f或仅处理原始f的输出.我想要改写f.
谢谢.:)
Ale*_*kov 11
你可以使用Villegas-Gayley技巧.
对于Sin
功能:
Unprotect[Sin];
Sin[args___]/;!TrueQ[$insideSin]:=
Block[{$insideSin=True,result},
If[OddQ[result=Sin[args]],result]
];
Protect[Sin];
{Sin[Pi],Sin[Pi/2]}
==> {Null,1}
Run Code Online (Sandbox Code Playgroud)
小智 6
我更喜欢一个功能强大的方法,让我想起Python中的装饰器.http://wiki.python.org/moin/PythonDecorators
首先我们创建装饰器:
OddOnly[x_] := If[OddQ[x], x, Null];
Run Code Online (Sandbox Code Playgroud)
然后它可以用作前缀:
OddOnly@
Sin[Pi]
Null (* Doesn't actually give a result *)
OddOnly@
Sin[Pi/2]
1
Run Code Online (Sandbox Code Playgroud)
我更喜欢Searke方法的一种变体:
OddOnly[s_Symbol] :=
Composition[If[OddQ@#, #, ##&[]] &, s]
Run Code Online (Sandbox Code Playgroud)
这会自动删除非奇怪的结果,并将其应用于函数本身,我觉得更方便.
例子:
OddOnly[Sin] /@ {2, Pi, Pi/2}
(* Out[]= {1} *)
Array[OddOnly[Binomial], {5, 5}]
(* Out[]= {{1}, {1}, {3, 3, 1}, {1}, {5, 5, 1}} *)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
582 次 |
最近记录: |