misc
:: maprec
Сопоставьте функцию с подвыражениями выражения
Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.
Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.
misc::maprec(ex
, selector = funci, …
, <PreMap | PostMap
>, <NoOperators>, <Unsimplified>)
misc::maprec(ex, selector=funci)
сопоставляет функциональный funci
со всеми подвыражениями выражения ex
, которые удовлетворяют данный критерий (заданный selector
), и заменяет каждое выбранное подвыражение s
funci(s)
.
Несколько различных функций могут быть сопоставлены с подвыражениями, удовлетворяющими различные критерии выбора.
misc::maprec(ex, selector1 = funci1, …, selectorn = funcin)
выполняет два шага: это тестирует, соответствует ли ex
критерию выбора, заданному некоторым селекторным selector_k
(и, если да, ex
замен funci_k(ex)
); и это применяет себя рекурсивно ко всем операндам ex
. Порядок этих шагов определяется опциями PreMap
и PostMap
.
Селекторы применяются слева направо; если выражение соответствует некоторому критерию выбора, никакие дальнейшие селекторы не пробуют.
selector
может иметь две формы. Это может быть набор {t 1, …, t n}. Здесь s
подвыражения ex
выбран, если тип (s1) является одним из типов t 1, …, t n. Если это не набор, подвыражение, s
ex
выбран, если p
возвращает TRUE
. Когда каждый объект MuPAD® может быть применен как функция к s
, p
может иметь любой тип в последнем случае.
По порядку, чтобы не выбрать подвыражение, селекторная потребность не возвращает FALSE
; это удовлетворяет, что не возвращает TRUE
.
Если ни опция PreMap
, ни опция, которую дан PostMap
, то PreMap
используется.
Используйте команду misc::breakmap
в funci
в порядке остановить рекурсивное отображение. Смотрите страницу справки misc::breakmap
для примера.
Только подвыражения доменного типа, DOM_ARRAY
, DOM_EXPR
, DOM_LIST
, DOM_SET
и DOM_TABLE
сопоставлены рекурсивно, а также доменные элементы доменного T
, для которого слот T::enableMaprec
существует и равняется TRUE
; слот T::map
, работающий правильно, должен затем существовать, также. К подвыражениям других типов применяется selector
, но misc::maprec
не сопоставлен с их операндами. (Это должно избежать нежелательных замен.), Если вы хотите рекурсивно вызвать их, или добавить enableMaprec
- слот, или используют selector
, который выбирает такие подвыражения, и заставьте funci
инициировать другое рекурсивное отображение.
misc::maprec
является сверхзагружаемым. Если область подвыражения имеет метод "maprec"
, то этот метод вызван подвыражением и другими аргументами вызова.
Подвыражение заменяется результатом, но misc::maprec
не сопоставлен со своими операндами; такое рекурсивное отображение должно быть сделано доменным методом при желании.
Операторы выражений (op(expression, 0)
) также сопоставлены рекурсивно как все другие операнды. Используйте NoOperators
, чтобы выключить это.
В следующем примере каждое целое число данного выражения a+3+4
заменяет значение 10. Поскольку 10(n)
возвращает 10
для каждого целочисленного n
, это достаточно, чтобы записать 10
вместо n -> 10
здесь.
misc::maprec(hold(a+3+4), {DOM_INT} = 10)
В примере выше, мы использовали hold
, чтобы подавить оценку выражения, потому что в противном случае a+3+4
оценен к a+7
, и мы получаем результат:
misc::maprec(a+3+4, {DOM_INT} = 10)
Упрощения получившегося 10 + 10
к 20
можно избежать при помощи опции Unsimplified
:
misc::maprec(hold(a+3+4), {DOM_INT} = 10, Unsimplified)
Теперь мы даем пример, где selector
является функцией. Мы хотим устранить все простые числа из выражения.
misc::maprec(hold(_plus)(i $ i=1..20), isprime= null(), PostMap)
Здесь isprime
возвращает TRUE
для каждого простого числа между 1 и 20. Каждое простое число между 1 и 20 заменяется пустым указателем () (поскольку null()(p)
дает null()
), что означает, что вышеупомянутый вызов вычисляет сумму всех непростых чисел между 1 и 20.
Обычно, misc::maprec
рекурсивно вызывает также в операторы подвыражений. Это может быть нежелательно во многих случаях:
misc::maprec(a+b, {DOM_IDENT}= (x -> x.1))
Мы только хотели заменить слагаемых, но не оператор. Используя опцию NoOperators
помогает:
misc::maprec(a+b, {DOM_IDENT}= (x -> x.1), NoOperators)
|
Любой объект MuPAD |
|
Любой объект MuPAD |
|
Любой объект MuPAD |
|
Для каждого подвыражения |
|
Для каждого подвыражения |
|
Селектор не применяется к оператору |
|
Получившиеся выражения далее не упрощены. |
misc::maprec
может возвратить любой объект MuPAD.
ex