Объявления типов функций в Mathematica - PullRequest
3 голосов
/ 09 апреля 2011

Я несколько раз сталкивался с этой проблемой в отношении типов объявлений входных данных, которые Mathematica понимает для функций.

Кажется, Mathematica понимает объявления следующих типов: _Integer, _List, _? MatrixQ, _? VectorQ

Однако: _Real, _Complex объявления, например, вызывают функцию иногда не для вычисления.Есть идеи почему?

Какое здесь общее правило?

Ответы [ 3 ]

10 голосов
/ 09 апреля 2011

Когда вы делаете что-то вроде f[x_]:=Sin[x], вы определяете правило замены шаблона.Если вместо этого вы скажете f[x_smth]:=5 (если вы попробуете оба, выполните Clear[f] перед вторым примером), вы на самом деле говорите «где бы вы ни увидели f[x], проверьте, равен ли x заголовок smth, и, еслизаменить на 5 ".Попробуйте, например,

Clear[f]
f[x_smth]:=5
f[5]
f[smth[5]]

Итак, чтобы ответить на ваш вопрос, правило таково, что в f[x_hd]:=1;, hd может быть чем угодно и соответствует заголовку x.

Можно также иметь более сложные определения, такие как f[x_] := Sin[x] /; x > 12, которые будут совпадать, если x> 12 (конечно, это может быть произвольно усложнено).

Редактировать: я забыл оРеальная часть.Вы, конечно, можете определить Clear[f];f[x_Real]=Sin[x], и это работает, например, для f [12.].Но вы должны иметь в виду, что, хотя Head[12.] равно Real, Head[12] равно Integer, поэтому ваше определение не будет совпадать.

6 голосов
/ 10 апреля 2011

Просто короткая заметка, так как никто другой не упомянул об этом.Вы можете сопоставить шаблон для нескольких Head s - и это быстрее, чем использование условного соответствия ? или /;.

f[x:(_Integer|_Real)] := True (* function definition goes here *)

Для простых функций, действующих на аргументы Real или Integer, он запускаетсяпримерно в 75% случаев аналогичное определение

g[x_] /; Element[x, Reals] := True (* function definition goes here *)

(которое, как указывал WReach, работает в 75% случаев
как g[x_?(Element[#, Reals]&)] := True).

Преимущество последней формы заключается в том, что она работает с символическими константами, такими как Pi - хотя, если вам нужна чисто числовая функция, это можно исправить в первой форме с использованием N.

4 голосов
/ 09 апреля 2011

Наиболее вероятная проблема - это ввод, который вы используете для проверки функций.Например,

f[x_Complex]:= Conjugate[x]
f[x + I y]
f[3 + I 4]

возвращает

f[x + I y]
3 - I 4

Причина, по которой второй работает, а первый нет, раскрывается при взгляде на их FullForm s

x + I y // FullForm == Plus[x, Times[ Complex[0,1], y]]
3 + I 4 // FullForm == Complex[3,4]

Внутренне Mathematica преобразует 3 + I 4 в Complex объект, потому что каждый из терминов числовой, но x + I y не получает такой же обработки, как x и y равны Symbols.Точно так же, если мы определим

g[x_Real] := -x

и используем их

g[ 5 ]  == g[ 5 ]
g[ 5. ] == -5.

Ключ здесь в том, что 5 является Integer, который не распознается как подмножество Real, но при добавлении десятичной точки она становится Real.

Как указывалось acl , шаблон _Something означает совпадение с чем-либо с Head === Something, и оба случая _Real и _Complex очень ограничены в том, что даноHead s.

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