exponenta event banner

Индексированная ссылка

Как работает индексированная ссылка

Индексированные ссылки на объекты имеют три формы - круглые скобки, фигурные скобки и точечные имена:

A(I)
A{I}
A.name

Каждая из этих инструкций приводит к вызову MATLAB ® subsref класса Aили вызов встроенного subsref функция, если класс A не реализует subsref способ.

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), где struct S имеет следующие значения:

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}

Связанные темы