:=, _assign

Присвойте переменные

Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.

Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразуют Notebook MuPAD в Live скрипты MATLAB.

Синтаксис

x := value
_assign(x, value)
 [x1, x2, …] := [value1, value2, …] 
_assign([x1, x2, …], [value1, value2, …])
 f( X1, X2, … ) := value 
_assign(f(X1, X2, …), value)

Описание

x := value присваивает переменную x value.

[x1, x2, ...] := [value1, value2, ...] присваивает переменные x1x2 и т.д. соответствующие значения value1, value2 и т.д.

f(X1, X2, ...) := value добавляет запись в помнить таблицу процедуры f.

_assign(x, value) эквивалентно x := value.

_assign([x1, x2, ...], [value1, value2, ...]) эквивалентно [x1, x2, ...] := [value1, value2, ...]. Оба списка должны иметь то же число элементов.

Примечание

Если x ни список, ни таблица, ни массив, ни hfarray, ни матрица, ни элемент области с пазом "set_index", затем индексируемое присвоение, такое как x[i] := value неявно поворачивает идентификатор x в таблицу с однократным (i = value). Смотрите пример 2.

Присвоение f(X1, X2, ...) := value добавляет запись в помнить таблицу процедуры f.

Примечание

Если f ни процедура, ни функциональная среда, затем f неявно превращен в (тривиальную) процедуру с однократным (X1, X2, ...) = value в помнить таблицу. Смотрите Пример 4.

Идентификаторы на левой стороне присвоения не оценены (используйте evalassign если это не желаемо). Т.е. в x := value, предыдущее значение x, если таковые имеются, удален и заменен новым значением. Обратите внимание, однако, что индекс индексируемого идентификатора оценен. Т.е. в x[i] := value, индекс i заменяется его текущим значением перед соответствующей записью x присвоен значение. Смотрите Пример 5.

Примеры

Пример 1

Оператор присваивания := может быть применен к одному идентификатору, а также к списку идентификаторов:

x := 42:
[x1, x2, x3] := [43, 44, 45]:
x, x1, x2, x3

В случае списков все переменные левой стороны присвоены их значения одновременно:

[x1, x2] := [3, 4]:
[x1, x2] := [x2, x1]:
x1, x2

Функциональный эквивалент оператора присвоения := функциональный _assign:

_assign(x, 13): _assign([x1, x2], [14, 15]): x, x1, x2

Присвоенные значения удалены через ключевое слово delete:

delete x, x1, x2:
x, x1, x2

Пример 2

Присваивая значение индексируемому идентификатору, соответствующая таблица (table, DOM_TABLE) сгенерирован неявно, если идентификатор не был присвоен список, таблица, массив, hfarray или матрица прежде:

delete x:
x[1] := 7:
x

Если x список, таблица, массив, hfarray или матрица, затем индексируемое присвоение добавляет дальнейшую запись или изменяет существующую запись:

x[abc] := 8:
x

x := [a, b, c, d]:
x[3] := new:
x

x := array(1..2, 1..2):
x[2, 1] := value:
x

delete x:

Пример 3

Для эффективного использования индексируемых присвоений (см. Пример 2 для обзора), программисты должны отметить следующие правила:

MuPAD® использует подсчет ссылок и таким образом позволяет несколько ссылок на идентичные структуры данных. Изменение одного из этих логически отличных значений означает, что внутренняя структура должна быть скопирована, который занимает время:

n := 10^4:
L := [0$n]:
time((for i from 1 to n do
        L_old := L:
        L[i] := i:
      end_for))

Сравните это с ситуацией, где только одна переменная или идентификатор относятся к внутренней структуре:

n := 10^4:
L := [0$n]:
time((for i from 1 to n do
        L[i] := i:
      end_for))

Для списков существует другая ситуация, которая требует копирования структуры списка: Изменение длины списка. Пример, с которым наиболее часто сталкиваются, добавляет к списку с _concat (.) или append:

n := 10^4:
L := []:
time((for i from 1 to n do
        L := L . [i]:
      end_for))

Цикл, записанный как выше времени выполнения взятий, примерно пропорционального квадрату числа элементов. Желательно переписать такие циклы. В случае, где вы знаете длину итогового списка заранее, можно создать такой список и заменить его записи в цикле:

n := 10^4:
L := [NIL$n]:
time((for i from 1 to n do
        L[i] := i:
      end_for))

Если вы не знаете итоговой длины, можно получить линейное время выполнения первым сбором элементов в таблицу:

n := 10^4:
T := table()
time((for i from 1 to n do
        T[nops(T)+1] := i;
      end_for;
      L := [T[i] $ i = 1..nops(T)]))

Пример 4

Рассмотрите простую процедуру:

f := x -> sin(x)/x:
f(0)
Error: Division by zero.
  Evaluating: f

Следующее присвоение добавляет запись в помнить таблицу:

f(0) := 1:
f(0)

Если f не оценивает к функции, затем тривиальная процедура с помнить таблицей создается неявно:

delete f:
f(x) := x^2:
expose(f)
proc()
  name f;
  option remember;
begin
  procname(args())
end_proc

Обратите внимание на то, что помнить таблица только обеспечивает результат для входа x:

f(x), f(1.0*x), f(y)

delete f:

Пример 5

Левая сторона присвоения не оценена. В следующем, x := 3 присваивает новое значение x, не к y:

x := y:
x := 3:
x, y

Следовательно, следующее не является присвоением кратного на идентификаторы в списке, но однократным присвоением к списку L:

L := [x1, x2]:
L := [21, 22]:
L, x1, x2

Однако индексы оценены в индексируемых присвоениях:

i := 2:
x[i] := value:
x

for i from 1 to 3 do
  x[i] := i^2;
end_for:
x

delete x, L, i:

Пример 6

Поскольку присвоение имеет возвращаемое значение (присвоенное значение), следующая команда присваивает значения нескольким идентификаторам одновременно:

a := b := c := 42:
a, b, c

По синтаксическим причинам внутреннее присвоение должно быть заключено дополнительными скобками в следующей команде:

a := sin((b := 3)):
a, b

delete a, b, c:

Параметры

x, x1, x2, …

Идентификаторы или индексированные идентификаторы

value, value1, value2, …

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

f

Процедура или функциональная среда

X1, X2, …

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

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

value или [value1, value2, ...], соответственно.

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

Функции MuPAD