Как проще всего ограничить вывод встроенной функции в Mathematica? скажем пусть грех возвращает только нечетные числа? - PullRequest
8 голосов
/ 20 мая 2011

Например, для встроенной функции в Mathematica, f изначально f [1] дает {1,2,3}, но я хочу, чтобы Mathematica давала только {1,3},Требуется простой метод перезаписи f.Я не хочу определять новую функцию или полностью переписывать f или просто иметь дело с исходными выводами f.Я хочу переписать е.

Спасибо.:)

Ответы [ 4 ]

11 голосов
/ 20 мая 2011

Для этого можно использовать трюк Виллегаса-Гейли .

Для функции 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}
6 голосов
/ 21 мая 2011

Вариант метода Сирка, который я предпочитаю:

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}}  *)
6 голосов
/ 20 мая 2011

Я предпочитаю метод, который является функциональным и напоминает мне декораторы в Python.http://wiki.python.org/moin/PythonDecorators

Сначала мы создаем декоратор:

OddOnly[x_] := If[OddQ[x], x, Null];

Затем его можно использовать в качестве префикса:

OddOnly@
 Sin[Pi]

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

OddOnly@
 Sin[Pi/2]

1
4 голосов
/ 20 мая 2011

Может применяться правило вида

whatever /. _Integer?EvenQ :>Sequence[]

Даниэль Лихтблау

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...