Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wolfram mathematica 约束内置函数的最简单方法是什么;Mathematica的输出?说让Sin只返回奇数?_Wolfram Mathematica - Fatal编程技术网

Wolfram mathematica 约束内置函数的最简单方法是什么;Mathematica的输出?说让Sin只返回奇数?

Wolfram mathematica 约束内置函数的最简单方法是什么;Mathematica的输出?说让Sin只返回奇数?,wolfram-mathematica,Wolfram Mathematica,例如,对于Mathematica中的内置函数,f,最初f[1]给出{1,2,3},但我想让Mathematica只给出{1,3}。需要一种简单的重写f的方法。我不想定义一个新函数,或者完全重写f,或者仅仅处理原始f的输出。我想重新接f 谢谢。:) 可以应用这种形式的规则 whatever /. _Integer?EvenQ :>Sequence[] Daniel Lichtblau您可以使用它 对于Sin功能: Unprotect[Sin]; Sin[args___]/;!TrueQ[$

例如,对于Mathematica中的内置函数,f,最初f[1]给出{1,2,3},但我想让Mathematica只给出{1,3}。需要一种简单的重写f的方法。我不想定义一个新函数,或者完全重写f,或者仅仅处理原始f的输出。我想重新接f


谢谢。:)

可以应用这种形式的规则

whatever /. _Integer?EvenQ :>Sequence[]
Daniel Lichtblau

您可以使用它

对于
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}

我更喜欢函数式的方法,它让我想起Python中的装饰器

首先,我们创建装饰器:

OddOnly[x_] := If[OddQ[x], x, Null];
然后可以将其用作前缀:

OddOnly@
 Sin[Pi]

Null (* Doesn't actually give a result *)

OddOnly@
 Sin[Pi/2]

1

我更喜欢Searke方法的一个变体是:

OddOnly[s_Symbol] := 
 Composition[If[OddQ@#, #, ##&[]] &, s]
这会自动删除不奇怪的结果,并将其应用于函数本身,我发现这更方便

示例:

OddOnly[Sin] /@ {2, Pi, Pi/2}

(*  Out[]= {1}  *)

Array[OddOnly[Binomial], {5, 5}]

(*  Out[]= {{1}, {1}, {3, 3, 1}, {1}, {5, 5, 1}}  *)

$Post
似乎是一个好方法,但它适用于所有我不想要的内置函数?
$Post
适用于每个输出表达式,正如文档中明确说明的那样。它不知道这个表达式是如何生成的。在你的例子中,你是指
f[1]
gives
{1,2,3}
,还是指类似
f/{3,5,7}
gives
{1,2,3}
?我这样问是因为
Sin
只给出了一个数字输出,而不是一个列表。下面有一些解决方案,但它确实会给处理系统符号带来麻烦。最好编写一个新函数mySin[],调用内置的Sin[],并在返回之前更改输出。@Sjoerd:你的答案正是我一直在寻找的答案。很抱歉反应太晚(非常非常感谢这种出色的黑客方法!:)@Fresh事实上,上面是Alexey写的,他指的是一个我们在Mathematica toolbag问题()上发表以来一直在使用的技巧。好主意-+1。因为我知道你对简洁的热情,让我指出,效果相当于
Unevaluated@Sequence[]
内部
如果
(或
保持*
但不
序列保持
的任何头部)也可以通过
序列@@{}
@Mr.Wizard实现,则惩罚是因为它是一次评估,我想<代码>未评估
被评估者剥离,没有任何子评估。但是,
Apply[Sequence,{}]
必须进行单独的评估。也许,还有其他更微妙的原因我也不知道。@Leonid,感谢你的想法。有趣的是,如果我设置
vash[]:=Sequence[]
然后使用
vash[]
它几乎和
Unevaluated@Sequence[]
;比
Sequence@@{}
@Mr.Wizard更快这似乎是合乎逻辑的。在我意识到
Sequence@@{}
之前,我使用的是
1/(1:>Sequence[])
或类似的东西,这是您的
invision
的本地版本。我认为,这里的速度增加部分是由于
RuleDelayed
(和
SetDelayed
)是
SequenceHold
。简单的重写比诱导(次级)评估要快,这就是
Apply
@Leonid发生的情况,今天在我的笔记中我发现了一个更简短的形式:
##&[]
我希望我的记忆力是我聪明时的一半