exponenta event banner

Индексированное назначение

Как работает индексированное назначение

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

A(I) = B
A{I} = B
A.name = B

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

MATLAB передает три аргумента subsasgn и требует subsasgn для возврата результата назначения:

A = subsasgn(A,S,B)

Первый аргумент, A, является объектом, которому присваивается значение в третьем аргументе B.

Вторым аргументом является структура индексирования, substruct. S имеет два поля:

  • S.type является char вектор, содержащий '()', '{}', или '.' указание используемого типа индексирования.

  • S.subs - массив ячеек или символьный массив, содержащий фактические индексы или имя поля. Двоеточие, используемое в качестве индекса, передается в массиве ячеек в качестве символа ':'. Диапазоны, указанные с помощью двоеточия (например, 2:5) развернуты до 2 3 4 5.

Например, оператор назначения:

A(2,3) = B;

генерирует вызов для subsasgn:

A = subsasgn(A,S,B)

S содержит:

S.type = '()'
S.subs = {2,3}

Встроенный subsasgn:

  • Определяет класс A. Если B не тот же класс, что и A, то MATLAB пытается построить объект того же класса, что и A использование B в качестве входного аргумента. Если эта попытка не удалась, MATLAB возвращает ошибку.

  • Если A и B являются или могут быть включены в один и тот же класс, то MATLAB присваивает значение B к элементу массива в строке 2, столбец 3.

  • Если A не существует до выполнения инструкции assignment, то MATLAB инициализирует пять элементов массива, которые пришли раньше A(2,3) с объектами класса по умолчанию B.

Аналогично, это выражение

A{2,3} = B

Использует эти значения для S:

S.type ='{}'
S.subs = {2,3} 

Встроенный subsasgn:

  • Назначает B в cell элемент массива в строке 2, столбец 3.

  • Если A не существует до выполнения инструкции присвоения, MATLAB инициализирует пять ячеек, которые пришли раньше A(2,3) с []. В результате получается массив ячеек 2 на 3.

Это выражение:

A.Name = B

Требования A = subsasgn(A,S,B) где struct S имеет следующие значения:

S.type = '.'
S.subs = 'Name'

Встроенный subsasgn:

  • Назначает B в struct область Name.

  • Если A не существует до выполнения инструкции присвоения, MATLAB создает struct переменная, A с полем Name и присваивает значение B в это местоположение поля.

  • Если struct A существует, но не имеет поля Name, то MATLAB добавляет поле Name и присваивает значение B в новое местоположение поля.

  • Если struct A существует и имеет Name , то MATLAB присваивает значение B кому Name.

Можно переопределить все или некоторые из этих вариантов поведения назначения, внедрив subsasgn метод для вашего класса.

Индексированное назначение объектам

Если A является объектом, это выражение:

A.Name = B

Требования A = subsasgn(A,S,B) где, S имеет следующие значения:

S.type = '.'
S.subs = 'Name'

Дефолт subsasgn:

  • Попытки назначения B в Name собственность.

  • Если класс A не имеет Name MATLAB возвращает ошибку.

  • Если Name свойство имеет ограниченный доступ (private или protected), MATLAB определяет, разрешено ли назначение на основе контекста, в котором выполняется назначение.

  • Если класс A определяет метод набора для свойства NameMATLAB вызывает метод set.

  • MATLAB применяет все остальные атрибуты свойств, прежде чем определить, следует ли назначать B к свойству Name.

Составные индексированные назначения

Эти простые вызовы объединяются для более сложных выражений индексирования. В таких случаях length(S) - количество уровней индексации. Например,

A(1,2).PropertyName(1:4) = B

требования subsasgn(A,S,B), где S - массив структур 3 на 1 со значениями:

S(1).type = '()'    S(2).type = '.'              S(3).type = '()'
S(1).subs = {1,2}   S(2).subs = 'PropertyName'   S(3).subs = {1:4}

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