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