map
Примените функцию ко всем операндам объекта
Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.
Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.
map(object
,f
, <p1, p2, , …
>) map(object
,f
, <p1, p2, , …
>, <Unsimplified>)
map(object, f)
возвращает копию object
, где каждый операнд x
был заменен f(x)
. Сам объект не изменяется map
(см. Пример 2).
Второй аргумент f
может быть процедурой, сгенерированной через ->
или proc
(например, x -> x^2 + 1
), функциональная среда (например, sin
), или функциональное выражение (например, sin@exp + 2*id
).
Если дополнительные аргументы присутствуют, то каждый операнд, x
object
заменяется f(x, p1, p2, ...)
(см. Пример 1).
Возможно применить оператор, такой как +
или *
, ко всем операндам object
, при помощи его функционального эквивалента, таким как _plus
или _mult
. Смотрите Пример 1.
В отличие от op
, map
не анализирует рациональные числа и комплексные числа далее. Таким образом, если аргумент является рациональным числом или комплексным числом, то f
применяется к самому номеру а не к числителю и знаменателю или действительной части и мнимой части, соответственно (см. Пример 3).
Если object
является строкой, то f
применяется к строке в целом а не к отдельным символам (см. Пример 3).
Если object
является выражением, то f
применяется к операндам f
, как возвращено op
(см. Пример 1).
Если object
является последовательностью выражения, то эта последовательность не сглажена map
(см. Пример 4).
Если object
является полиномом, то f
применяется к самому полиному а не ко всем его коэффициентам. Используйте mapcoeffs
, чтобы достигнуть последнего (см. Пример 3).
Если object
является списком, набором, массивом или hfarray, то функциональный f
применяется ко всем элементам соответствующей структуры данных.
Если object
является таблицей, функциональный f
применяется ко всем записям таблицы, не к индексам (см. Пример 9). Записи являются правыми сторонами операндов таблицы.
Если object
является элементом области библиотеки, то слот "map"
области называется, и результат возвращен. Это может использоваться, чтобы расширить функциональность map
к пользовательским областям. Если никакой слот "map"
не существует, то f
применяется к самому объекту (см. Пример 10).
map
не оценивает свой результат после замены; используйте eval
, чтобы достигнуть этого. Тем не менее, внутренние упрощения происходят после замены, если опция Unsimplified
не дан (см. Пример 8).
map
не убывает рекурсивно в объект; функциональный f
только применяется к операндам на первом уровне. Используйте misc::maprec
для рекурсивной версии map
(см. Пример 11).
Процедура f
должен быть детерминирован и не должен иметь побочных эффектов (таких как изменение и использование глобальных переменных). Пользователь не имеет никакого контроля над упорядоченным расположением, в котором функция применяется к операндам объекта!
map
работает на выражения:
map(a + b + 3, sin)
Дополнительные аргументы map
передаются сопоставляемой функции:
map(a + b + 3, f, x, y)
В следующем примере мы добавляем 10
в каждый элемент списка:
map([1, x, 2, y, 3, z], _plus, 10)
Как большинство других функций MuPAD®, map
не изменяет свой первый аргумент, но возвращает измененную копию:
a := [0, PI/2, PI, 3*PI/2]: map(a, sin)
Список a
все еще имеет свое исходное значение:
a
map
не анализирует рациональные и комплексные числа:
map(3/4, _plus, 1), map(3 + 4*I, _plus, 1)
map
не анализирует строки:
map("MuPAD", text2expr)
map
не анализирует полиномы:
map(poly(x^2 + x + 1), _plus, 1)
Используйте mapcoeffs
, чтобы применить функцию ко всем коэффициентам полинома:
mapcoeffs(poly(x^2 + x + 1), _plus, 1)
Первый аргумент не сглажен:
map((1, 2, 3), _plus, 2)
Иногда функция MuPAD возвращает набор или список больших символьных выражений, содержащих математические константы и т.д. Чтобы получить лучшую интуицию о результате, можно сопоставить функциональный float
со всеми элементами, который часто решительно уменьшает размер выражений:
solve(x^4 + x^2 + PI, x)
map(%, float)
В следующем примере мы удаляем значения всех глобальных идентификаторов на текущем сеансе MuPAD. Команда anames(All, User)
возвращает набор с именами всех пользовательских глобальных идентификаторов, имеющих значение. Отображение функционального _delete
к этому набору удаляет значения всех этих идентификаторов. Поскольку возвращаемое значение _delete
является пустой последовательностью null()
, результатом вызова является пустое множество:
x := 3: y := 5: x + y
map(anames(All, User), _delete)
x + y
Возможно выполнить произвольные действия со всеми элементами структуры данных через один вызов map
. Это работает путем передачи анонимной процедуры в качестве второго аргумента f
. В следующем примере мы проверяем, что факт “целочисленный n ≥ 2 является главным, если и только если φ (n) = n - 1”, где φ обозначает функцию тотиента Эйлера, содержит для всего целого числа 2 ≤ n <10. Мы делаем это путем сравнения результата isprime(n)
со значением истинности уравнения φ (n) = n - 1 для всех элементов n
списка, содержащего целые числа между 2
и 9
:
map([2, 3, 4, 5, 6, 7, 8, 9], n -> bool(isprime(n) = bool(numlib::phi(n) = n - 1)))
Результат map
не оценен далее. При желании необходимо запросить оценку явным образом eval
:
map(sin(5), float); eval(%)
delete a: A := array(1..1, [a]); a := 0: map(A, sin); map(A, eval@sin); delete a:
Тем не менее, определенные внутренние упрощения происходят, такие как вычисление арифметических операций с числовыми аргументами. Следующий вызов заменяет sqrt(2)
и PI
приближениями с плавающей точкой, и система автоматически упрощает получившуюся сумму:
map(sin(5) + cos(5), float)
Этого внутреннего упрощения можно избежать путем предоставления опции Unsimplified
:
map(sin(5) + cos(5), float, Unsimplified)
map
применился к табличным изменениям только правые стороны (записи) каждого операнда таблицы. Примите, что записи обозначают цены нетто, и налог с продаж (16 процентов в этом случае) должен быть добавлен:
T := table(1 = 65, 2 = 28, 3 = 42): map(T, _mult, 1.16)
map
может быть перегружен для элементов областей библиотеки, если slot"map"
задан. В этом примере d
является областью, ее элементы содержит два целых числа: индекс и запись (как таблица). Для хорошего входа и элементов печати этой области заданы slots"new"
и "print"
:
d := newDomain("d"): d::new := () -> new(d, args()): d::print := object -> _equal(extop(object)): d(1, 65), d(2, 28), d(3, 42)
Без слота "map"
функциональный f
будет применен к самому доменному элементу. Поскольку доменный d
не имеет никакого слота "_mult"
, результатом является символьный вызов _mult
:
map(d(1, 65), _mult, 1.16), type(map(d(1, 65), _mult, 1.16))
Слот "map"
этой области должен сопоставить заданную функцию только на второй операнд доменного элемента. Доменный d
добирается, слот "map"
и map
работает правильно (в смысле авторов) с элементами этой области:
d::map := proc(obj, f) begin if args(0) > 2 then d(extop(obj, 1), f(extop(obj, 2), args(3..args(0)))) else d(extop(obj, 1), f(extop(obj, 2))) end_if end_proc: map(d(1, 65), _mult, 1.16), map(d(2, 28), _mult, 1.16), map(d(3, 42), _mult, 1.16)
map
не работает рекурсивно. Предположим, что мы хотим к de-вложенному-множеству вложенный список. Мы используем map
, чтобы применить функциональный op
, который заменяет список последовательностью его операндов ко всем записям списка l
. Однако это только влияет на записи на первом уровне:
l := [1, [2, [3]], [4, [5]]]: map(l, op)
Используйте misc::maprec
, чтобы достигнуть желаемого поведения:
[misc::maprec(l, {DOM_LIST} = op)]
|
Произвольный объект MuPAD |
| |
|
Любые объекты MuPAD, принятые |
|
Получившиеся выражения далее не упрощены. |
Копия object
с f
применилась ко всем операндам.
object