Индексированные ссылки объекта находятся в трех формах — круглые скобки, фигурные скобки и точечное имя:
A(I) A{I} A.name
Каждый из этих операторов приводит к вызову MATLAB® к subsref
класса A
или вызов встроенной функции subsasgn
, если класс A
не реализует метод subsasgn
.
MATLAB передает два аргумента subsref
и требует, чтобы subsref
возвратил результат индексируемой ссылки:
B = subsref(A,S)
Первый аргумент является ссылаемым объектом, A
. Вторым аргументом, S
, является substruct
с двумя полями:
S.type
является вектором char
, содержащим '()'
, '{}'
или '.'
, задающий используемый тип индексации.
S.subs
является массивом ячеек или вектором char
, содержащим фактический индекс или имя. Двоеточие, используемое в качестве индекса, передается в массиве ячеек как символ двоеточия ':'
. Области значений указали, что использование двоеточия (например, 2:5
) расширены до 2 3 4 5
.
Например, выражение:
A(1:4,:)
MATLAB причин, чтобы вызвать subsref(A,S)
, где S
является структурой 1 на 1 с двухэлементным массивом ячеек. Массив ячеек содержит числа 1, 2, 3, 4 и символ двоеточия :
.
S.type = '()' S.subs = {1:4,':'}
Возврат содержимого каждой ячейки S.subs
дает индексные значения для первой размерности и вектора char
':'
для второго измерения:
S.subs{:}
ans = 1 2 3 4 ans = :
subsref
по умолчанию возвращает все элементы массива в строках 1 - 4 и все столбцы в массиве.
Точно так же это выражение:
A{1:4}
Использует массив ячеек, содержащий числа 1, 2, 3, 4.
S.type ='{}'
S.subs = {1:4}
subsref
по умолчанию возвращает содержимое всех элементов массива ячеек в строках 1 - 4 и всех столбцов в массиве.
Это выражение:
A.Name
subsref(A,S)
вызовов, где
S
struct
имеет эти значения:
S.type = '.' S.subs = 'Name'
Эти простые вызовы объединены для более сложных выражений индексации. В таких случаях length(S)
является количеством индексации уровней. Например,
A(1,2).PropertyName(1:4)
subsref(A,S)
вызовов, где S
является массивом 3 на 1 structs
со значениями:
S(1).type = '()' S(2).type = '.' S(3).type = '()' S(1).subs = {1,2} S(2).subs = 'PropertyName' S(3).subs = {1:4}