:=
, _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, ...]
присваивает переменные x1
x2
и т.д. соответствующие значения 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, ...]
, соответственно.