[], _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 в таблицу с однократным въездом.

Примеры

Пример 1

Решите эти переменные определения уравнений как индексированные идентификаторы:

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:

Пример 2

Используйте индексы, чтобы получить доступ к записям типичных контейнерных объектов, таким как списки, массивы, оборудование массивы с плавающей точкой и таблицы:

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:

Пример 3

Для конечных множеств индексируемый вызов x[i] возвращает i th элемент, как распечатано на экране. Этот элемент не обязательно совпадает с i th (внутренний) операнд, возвращенный op:

S := {3, 2, 1}

S[i] $ i = 1..3

op(S, i) $ i = 1..3

delete S:

Пример 4

Индексный оператор также работает с символьными строками. Символы перечисляются, начиная от 1:

"ABCDEF"[1], "ABCDEF"[6]

Пример 5

Индексный оператор также работает с математическими выражениями, содержащими операторы, такие как +, -, *, и так далее:

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:

Пример 6

Индексный оператор также работает с рациональными и комплексными числами. Для рациональных чисел индекс 1 относится к числителю и индексу, который 2 отсылает к знаменателю:

(2/3)[1], (2/3)[2]

Для комплексных чисел индексы 1 и 2 относятся к действительным и мнимым частям, соответственно:

(3*I)[1], (1-I)[2]

Пример 7

Можно использовать область значений в качестве индекса. Для списков, наборов, последовательностей выражения и строк, эта операция возвращает “подвыражение”, состоящее из записей в области значений, согласно _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

Пример 8

Используйте следующий индексируемый вызов, чтобы возвратить перестановку списка L. Здесь, список индексов perm задает перестановку.

L := [a, b, c, d, e]:
perm := [5, 3, 1, 2, 4]:
L[perm]

Пример 9

Используйте два списка индексов, чтобы выбрать и возвратить конкретную субматрицу матрицы:

A := matrix([[a11, a12, a13], [a21, a22, a23], [a31,a32, a33]]):
l1 := [1,2]: l2 := [2,3]:
A[l1, l2]

Пример 10

Индексируемые вызовы оценивают возвращенную запись. Используйте 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:

Пример 11

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

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):

Параметры

x

Произвольный объект MuPAD. В частности, контейнерный объект: список, конечное множество, массив, hfarray, матрица, таблица, последовательность выражения, выражение в обозначении оператора, рациональном числе, комплексном числе или символьной строке.

i

Индекс. Для большинства контейнерных объектов x индексы должны быть целыми числами. Если x является таблицей, можно использовать произвольные объекты MuPAD в качестве индексов.

i1,i2,...

Несколько индексов для матриц и многомерных массивов. Для этих контейнеров индексы должны быть целыми числами. Для таблиц можно также использовать несколько индексов, данных произвольными объектами MuPAD.

i1..i2

Индексы, заданные как область значений.

[i1,i2,...]

Индексы, заданные как список целых чисел. В этом случае x должен быть списком, матрицей или вектором. (В MuPAD вектор 1⨉n или матрица n×1.)

[i1,i2...], [k1,k2...]

Индексы, заданные как два списка целых чисел. В этом случае x должен быть матрицей.

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

Запись x, соответствующего индексу. Вызовы со списками индексов могут возвратить последовательность, список, вектор или матрицу записей, соответствующих индексам. Если x не является списком, набором, массивом или каким-либо другим контейнерным объектом, то возвращаемое значение является индексируемым объектом типа "_index".

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

x

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

Области MuPAD

Функции MuPAD