[]
, _index
Индексный доступ
Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.
Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.
x
[i
]x
[i1,i2,...
]x
[i1..i2
]x
[[i1,i2,...]
]x
[[i1,i2,...]
,[k1,k2,...]
] _index(x
,i
) _index(x
,i1,i2,...
) _index(x
,i1..i2
) _index(x
,[i1,i2,...]
) _index(x
,[i1,i2,...], [k1,k2,...]
)
_index
является функциональной формой оператора []
. Вызовы x[...]
и _index(x,...)
эквивалентны.
x[i]
возвращает запись x
, соответствующего индексу i
. Любой объект x
MuPAD® позволяет индексируемый вызов формы x[i]
. Если x
не является контейнерным объектом (таким как наборы, списки, векторы, массивы, hfarrays, таблицы, матрицы), то x[i]
возвращает символьный индексируемый объект. В частности, если x
является идентификатором, то x[i]
возвращает “индексируемый идентификатор”. В этом случае индексы могут быть произвольными объектами MuPAD. Смотрите Пример 1.
x[i1,i2,...]
возвращает записи x
, соответствующего индексам i1,i2,...
, заданный как последовательность. Например, если x
является матрицей, то x[2, 3]
возвращает третий элемент второй строки x
.
x[i1..i2]
возвращает записи x
, соответствующего целочисленным индексам в области значений [i1..i2]
, включая x[i1]
и x[i2]
. В частности, это применяется к спискам, наборам, последовательностям выражения и строкам. Смотрите Пример 7.
x[[i1,i2,...]]
возвращает записи x
, соответствующего заданным индексам, данным как список целых чисел. Здесь, x
должен быть списком, матрицей или вектором.
Если x
является списком, то x[[i1,i2,...]]
возвращает список [x[i] $ i in [i1,i2,...]]
. Смотрите Пример 8.
Если x
является вектором - строкой, то x[[i1,i2,...]]
возвращает вектор - строку matrix(1, nops([i1,i2,...]), [x[i] $ i in [i1,i2,...]])
.
Если x
является вектор-столбцом, то x[[i1,i2,...]]
возвращает вектор-столбец matrix(nops([i1,i2,...]), 1, [x[i] $ i in [i1,i2,...]])
.
x[[i1,i2,...],[k1,k2,...]]
возвращает матричный matrix([[x[i,k] $ k in [k1,k2,...]] $ i in [i1,i2,...]])
. Здесь, x
должен быть матрицей. Смотрите Пример 9.
В зависимости от типа x
эти ограничения применяются к индексам:
Для списков, конечных множеств или последовательностей выражения, индекс i
может только быть целым числом от 1
до nops(x)
, or-nops(x)
к -1
или области значений этих чисел.
Для массивов и hfarrays, используйте соответствующие индексы i
или несколько индексов i1,i2,...
из индексной области значений, заданной array
или hfarray
. Целые числа вне этой области значений вызывают ошибку. Если какой-либо заданный индекс не является целым числом (например, символ i
), то x[i]
или x[i1,i2,...]
возвращены символически.
Для матриц используйте соответствующие индексы i
или двойные индексы i1,i2
из индексной области значений, заданной matrix
. Индексы вне этой области значений или символьные индексы вызывают ошибку.
Для таблиц можно использовать любой объект в качестве индекса. Если нет никакой соответствующей записи в таблице, то x[i]
или x[i1,i2,...]
возвращены символически.
Для символьных строк индекс i
должен быть целым числом от 1
до length(x)
.
_index
использует порядок, в котором записи появляются на экране, и op
использует внутренний порядок записей. Для некоторых контейнерных объектов отличаются эти порядки. В частности:
Для списков и последовательностей, x[i] = op(x,i)
для положительных индексов. Для отрицательных индексов, x[i] = op(x, nops(x) + 1 + i)
.
Для конечных множеств x[i]
возвращает i
th элемент, как распечатано на экране. Перед экраном вывод и индексный доступ, элементы наборов сортируются через слот DOM_SET::sort
. В целом, x[i] <> op(x, i)
для конечных множеств x
.
Для одномерных массивов x := array(1..n, [...])
или x := hfarray(1..n, [...])
, записи соответствуют операндам, x[i] = op(x,i)
.
Для одномерной матрицы, представляющей вектор-столбец, x[i] = x[i, 1] = op(x, i)
. Для одномерной матрицы, представляющей вектор - строку, x[i] = x[1, i] = op(x, i)
.
Запись, возвращенная индексируемым вызовом, полностью оценена. Для списков, матриц, массивов и таблиц, можно подавить оценку в индексируемых вызовах при помощи indexval
. Смотрите Пример 10.
Индексный доступ к выражениям и числам реализован через коллбэки библиотеки. Не используйте _index
в программных файлах, чтобы получить доступ к операндам выражений и чисел. Используйте op
вместо этого для большей эффективности.
Если x
не является контейнерным объектом (таким как наборы, списки, векторы, массивы, hfarrays, таблицы, матрицы), то индексируемые присвоения (такие как x[i] := value
) неявно преобразовывают x
в таблицу с однократным въездом.
Решите эти переменные определения уравнений как индексированные идентификаторы:
n := 4: equations := {x[i-1] - 2*x[i] + x[i+1] = 1 $ i = 1..n}: unknowns := {x[i] $ i = 1..n}: linsolve(equations, unknowns)
Символьные индексируемые объекты имеют тип "_index"
:
type(x[i])
delete n, equations, unknowns:
Используйте индексы, чтобы получить доступ к записям типичных контейнерных объектов, таким как списки, массивы, оборудование массивы с плавающей точкой и таблицы:
L := [1, 2, [3, 4]]: A := array(1..2, 2..3, [[a12, a13], [a22, a23]]): B := hfarray(1..2, 2..3, [[12.0, 13.0], [22.0, 23.0]]): T := table(1 = T1, x = Tx, (1, 2) = T12):
L[1], L[3][2], A[2, 3], B[2, 3], T[1], T[x], T[1, 2]
Используйте индексированные присвоения, чтобы изменить записи:
L[2]:= 22: L[3][2]:= 32: A[2, 3]:= 23: B[2, 3]:= 0: T[x]:= T12: L, A, B, T
delete L, A, B, T:
Для конечных множеств индексируемый вызов x[i]
возвращает i
th элемент, как распечатано на экране. Этот элемент не обязательно совпадает с i
th (внутренний) операнд, возвращенный op
:
S := {3, 2, 1}
S[i] $ i = 1..3
op(S, i) $ i = 1..3
delete S:
Индексный оператор также работает с символьными строками. Символы перечисляются, начиная от 1:
"ABCDEF"[1], "ABCDEF"[6]
Индексный оператор также работает с математическими выражениями, содержащими операторы, такие как +
, -
, *
, и так далее:
X := a - b + c - 2; X[2], X[3..-1]; delete X:
Для выражений с _plus
- и операторы _mult
, вывод _index
соответствует выходному порядку операндов. Если выражение с _mult
распечатано как часть, можно получить доступ к предлагающему кандидата лицу и знаменателю через индексы 1
и 2
:
X := ((a/2 + b) * c * 2)/(e-f)/x^2; X[1], X[2], X[1][3]; delete X:
Индексный оператор также работает с рациональными и комплексными числами. Для рациональных чисел индекс 1
относится к числителю и индексу, который 2
отсылает к знаменателю:
(2/3)[1], (2/3)[2]
Для комплексных чисел индексы 1
и 2
относятся к действительным и мнимым частям, соответственно:
(3*I)[1], (1-I)[2]
Можно использовать область значений в качестве индекса. Для списков, наборов, последовательностей выражения и строк, эта операция возвращает “подвыражение”, состоящее из записей в области значений, согласно _index
:
L := [1, 2, 3, 4, 5]: S := {1, 2, 3, 4, 5}: Str := "abcde":
L[3..4]; S[3..4]; Str[3..4]
Это включает области значений с отрицательными числами. Когда вы используете отрицательные индексы i
для контейнерных текстовых объектов x
, таких как списки и наборы, вызов, x[i]
возвращает x[nops(x) + 1 + i]
. Таким образом вы получаете доступ к элементам, считая индексы от конца x
: индекс -1
обращается к последнему элементу x
, индекс -2
, обращается к второму элементу от конца и так далее.
L[3..-1]; S[1..-2]
Когда вы используете отрицательные индексы i
для строк, _index
внутренне заменяет Str[i]
на индексы op(Str, i + 1 + length(Str))
:
Str[3..-1]
Также можно использовать эту форму индексации, чтобы присвоить значения элементам списков и строкам:
L[2..4] := [234]: L; Str[3..-1] := " ??": Str;
Как замечено выше, эта операция может изменить число элементов в списке или длине строки. При необходимости новые места заполнены NIL
или пробелами, соответственно:
L[42..42] := [42]: L; Str[10..11] := "the end.": Str
Используйте следующий индексируемый вызов, чтобы возвратить перестановку списка L
. Здесь, список индексов perm
задает перестановку.
L := [a, b, c, d, e]: perm := [5, 3, 1, 2, 4]: L[perm]
Используйте два списка индексов, чтобы выбрать и возвратить конкретную субматрицу матрицы:
A := matrix([[a11, a12, a13], [a21, a22, a23], [a31,a32, a33]]): l1 := [1,2]: l2 := [2,3]: A[l1, l2]
Индексируемые вызовы оценивают возвращенную запись. Используйте indexval
, чтобы подавить полную оценку:
delete a: x := [a, b]: a := c: x[1] = eval(x[1]), x[1] <> indexval(x, 1)
delete a: x := table(1 = a, 2 = b): a := c: x[1] = eval(x[1]), x[1] <> indexval(x, 1)
delete a: x := array(1..2, [a, b]): a := c: x[1] = eval(x[1]), x[1] <> indexval(x, 1)
delete a: x := matrix([a, b]): a := c: x[1] = eval(x[1]), x[1] <> indexval(x, 1)
delete x, a:
Индексный доступ не реализован для некоторых областей ядра:
12343[3]
Error: Invalid operand. [_index]
Задайте метод, реализующий индексный доступ к целым числам:
unprotect(DOM_INT): DOM_INT::_index := (n, i) -> text2expr(expr2text(n)[i]): 12343[3]; delete DOM_INT::_index: protect(DOM_INT):
|
Произвольный объект MuPAD. В частности, контейнерный объект: список, конечное множество, массив, hfarray, матрица, таблица, последовательность выражения, выражение в обозначении оператора, рациональном числе, комплексном числе или символьной строке. |
|
Индекс. Для большинства контейнерных объектов |
|
Несколько индексов для матриц и многомерных массивов. Для этих контейнеров индексы должны быть целыми числами. Для таблиц можно также использовать несколько индексов, данных произвольными объектами MuPAD. |
|
Индексы, заданные как область значений. |
|
Индексы, заданные как список целых чисел. В этом случае |
|
Индексы, заданные как два списка целых чисел. В этом случае |
Запись x
, соответствующего индексу. Вызовы со списками индексов могут возвратить последовательность, список, вектор или матрицу записей, соответствующих индексам. Если x
не является списком, набором, массивом или каким-либо другим контейнерным объектом, то возвращаемое значение является индексируемым объектом типа "_index"
.
x