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 должен быть детерминирован и не должен иметь побочных эффектов (таких как изменение и использование глобальных переменных). Пользователь не имеет никакого контроля над упорядоченным расположением, в котором функция применяется к операндам объекта!

Примеры

Пример 1

map работает на выражения:

map(a + b + 3, sin)

Дополнительные аргументы map передаются сопоставляемой функции:

map(a + b + 3, f, x, y)

В следующем примере мы добавляем 10 в каждый элемент списка:

map([1, x, 2, y, 3, z], _plus, 10)

Пример 2

Как большинство других функций MuPAD®, map не изменяет свой первый аргумент, но возвращает измененную копию:

a := [0, PI/2, PI, 3*PI/2]:
map(a, sin)

Список a все еще имеет свое исходное значение:

a

Пример 3

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)

Пример 4

Первый аргумент не сглажен:

map((1, 2, 3), _plus, 2)

Пример 5

Иногда функция MuPAD возвращает набор или список больших символьных выражений, содержащих математические константы и т.д. Чтобы получить лучшую интуицию о результате, можно сопоставить функциональный float со всеми элементами, который часто решительно уменьшает размер выражений:

solve(x^4 + x^2 + PI, x)

map(%, float)

Пример 6

В следующем примере мы удаляем значения всех глобальных идентификаторов на текущем сеансе MuPAD. Команда anames(All, User) возвращает набор с именами всех пользовательских глобальных идентификаторов, имеющих значение. Отображение функционального _delete к этому набору удаляет значения всех этих идентификаторов. Поскольку возвращаемое значение _delete является пустой последовательностью null(), результатом вызова является пустое множество:

x := 3: y := 5: x + y

map(anames(All, User), _delete)

x + y

Пример 7

Возможно выполнить произвольные действия со всеми элементами структуры данных через один вызов 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)))

Пример 8

Результат 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)

Пример 9

map применился к табличным изменениям только правые стороны (записи) каждого операнда таблицы. Примите, что записи обозначают цены нетто, и налог с продаж (16 процентов в этом случае) должен быть добавлен:

T := table(1 = 65, 2 = 28, 3 = 42):
map(T, _mult, 1.16)

Пример 10

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)

Пример 11

map не работает рекурсивно. Предположим, что мы хотим к de-вложенному-множеству вложенный список. Мы используем map, чтобы применить функциональный op, который заменяет список последовательностью его операндов ко всем записям списка l. Однако это только влияет на записи на первом уровне:

l := [1, [2, [3]], [4, [5]]]:
map(l, op)

Используйте misc::maprec, чтобы достигнуть желаемого поведения:

[misc::maprec(l, {DOM_LIST} = op)]

Параметры

object

Произвольный объект MuPAD

f

Функция

p1, p2, …

Любые объекты MuPAD, принятые f как дополнительные параметры

Опции

Unsimplified

Получившиеся выражения далее не упрощены.

Возвращаемые значения

Копия object с f применилась ко всем операндам.

Перегруженный

object

Смотрите также

Функции MuPAD