:=, _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.
Оператор присваивания := может быть применен к одному идентификатору, а также к списку идентификаторов:
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
![]()
Присваивая значение индексируемому идентификатору, соответствующая таблица (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:
Для эффективного использования индексируемых присвоений (см. Пример 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)]))![]()
Рассмотрите простую процедуру:
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:
Левая сторона присвоения не оценена. В следующем, 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:
Поскольку присвоение имеет возвращаемое значение (присвоенное значение), следующая команда присваивает значения нескольким идентификаторам одновременно:
a := b := c := 42: a, b, c
![]()
По синтаксическим причинам внутреннее присвоение должно быть заключено дополнительными скобками в следующей команде:
a := sin((b := 3)): a, b
![]()
delete a, b, c:
|
Идентификаторы или индексированные идентификаторы |
|
Произвольные объекты MuPAD |
| |
|
Произвольные объекты MuPAD |
value или [value1, value2, ...], соответственно.