2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Функции в Mathematica
Сообщение05.09.2013, 15:51 


04/07/13
4
Вопрос такой как Mathematica сделать функцию от двух аргументов, при чем второй "опциональный", так чтобы если (x_ - число, то x; если x_-что-то другое, то ничего)

работающий пример такой

fun[a:_,b:_|PatternSequence[]]:=If[NumericQ[b], a b, a]

или

fun[a_,b_|PatternSequence[]]:=If[NumericQ[b], a b, a]

кому как больше нравиться, но хочется написать внутри функции, что то вроде

fun[a_,b_?NumericQ:PatternSequence[]]:=a b

это конечно не правильно, просто хочется проверки делать не снаружи а внутри и так чтобы если (x_ - число, то x; если x_-что-то другое, то ничего)
у кого нибудь есть какие нибудь идеи, я всё никак не могу сообразить....

 Профиль  
                  
 
 Re: Функции в Mathematica
Сообщение05.09.2013, 17:20 
Заслуженный участник


25/02/11
1797
В две строчки не устроит?
Код:
fun[a_, b_?NumericQ] := a b
fun[a_, b_] := a

Частные правила проверяются раньше.

 Профиль  
                  
 
 Re: Функции в Mathematica
Сообщение05.09.2013, 17:38 


04/07/13
4
я немного доработал, т.к. второй аргумент должен быть "опциональным", т.е. случай когда он отсутствует, тоже должен работать получилось

Код:
fun[a_,b_?NumericQ|PatternSequence[]]:=a b
fun[a_,b_]:= a


не совсем понял про частные правила, можете написать подробнее или дать ссылку в Mathematica Book, спасибо!

Решение интересное, но хотелось бы найти возможность сделать "без химии", при помощи одного объявления, этот пример понятно тестовый, хочется понять шаблон как делать такие функции...

 Профиль  
                  
 
 Re: Функции в Mathematica
Сообщение05.09.2013, 18:54 
Заслуженный участник


25/02/11
1797
Насчет правил, если для f заданы три определения, неважно в каком порядке
Код:
f[1]=2
f[a]:=a^2
f[x_]:=3x

Сначала будет проверяться первое (самое частное), потом второе, потом третье. Это есть в хелпе, но не помню где. Можно еще так:
Код:
fun[a_, b_?NumericQ] := a b
fun[a_, b_:1] := a b

Есть функция Default для опционального аргумента и связанная форма записи, но это тоже не в одну строчку.

 Профиль  
                  
 
 Re: Функции в Mathematica
Сообщение05.09.2013, 20:17 
Заслуженный участник


27/04/09
28128
(Опоздал, но пусть уж будет. :-) )

Частные правила — это, грубо говоря, те правила, в которых шаблоны соответствуют меньшему количеству вещей. Т. е., например, 0 соответствует только одному значению, _Integer — большему количеству, а _ — вообще всем вещам. И потому если у вас есть определения
Код:
f[0] = 1
f[_Integer] = 2
f[_] = 3
, даже если они будут исполнены в другом порядке, Mathematica при вызове f[что-нибудь] будет сначала проверять это что-нибудь на соответствие 0; потом, если не подойдёт, _Integer; потом _.

Правда, сейчас я не знаю, как будут сравниваться на «частность» два несравнимых шаблона, которым всё же соответствует что-то общее.

godaygo в сообщении #760756 писал(а):
но хотелось бы найти возможность сделать "без химии", при помощи одного объявления
Как по мне, это вредное стремление. Зачем такие ограничения?

 Профиль  
                  
 
 Re: Функции в Mathematica
Сообщение05.09.2013, 21:48 


04/07/13
4
С одной стороны такие ограничения, своего рода перфекционизм , с другой большая правая часть. Задача написать своего рода интерпритатор для внешней программы (правда технология моего написания немного глупая, но всё же), залить его в отдельную библиотеку, тут вроде понятно, что можно и без этого обойтись и использовать предложенные Вами решения.
Другой интерес вызван с точки Генетического программирования, где второй паттерн, это может быть и число и заголовок или вообще "какой нибудь зверь", а функцию составляет сама программа, что бы не заставлять программу думать сколько одинаковых функций писать (с пониманием этих частных правил), требуется написание одной функции с двумя аргументами, с тестовой проверкой для второго.

 Профиль  
                  
 
 Re: Функции в Mathematica
Сообщение05.09.2013, 21:54 
Заслуженный участник


27/04/09
28128
godaygo в сообщении #760869 писал(а):
что бы не заставлять программу думать сколько одинаковых функций писать
По-моему, выбор любого способа реализации такой функции требует от программы, составляющей её, думать одинаково много.

 Профиль  
                  
 
 Re: Функции в Mathematica
Сообщение05.09.2013, 22:47 


04/07/13
4
Не совсем так, на самом деле если бы в Mathematica было реализовано "выбор паттерна по условию", все было бы гораздо легче. Что-то вроде паттерна в стиле If или Switch . Но всё равно, спасибо Вам огромное!

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group