В этом разделе описывается, как разделять индекс на временные переменные, создаваемые вызовами функций. Временная переменная создается, когда результат вызова функции используется как промежуточная переменная в большем выражении. Результат вызова функции в выражении является временным, поскольку создаваемая им переменная существует только на короткое время и не сохраняется в рабочей области MATLAB ® после выполнения. Примером может служить выражениеmyFunction(x).prop, который звонит myFunction с аргументом x, а затем возвращает prop свойство результата. Таким образом можно вызвать любой тип функции (анонимную, локальную, вложенную или частную).
Рассмотрим функцию:
function y = myStruct(x) y = struct("Afield",x); end
Эта функция создает структуру с одним полем с именем Afieldи присваивает полю значение. Можно вызвать функцию и создать структуру с полем, содержащим значение 1, с помощью команды:
myStruct(1)
ans =
struct with fields:
Afield: 1Однако для непосредственного возврата значения поля можно выполнить индексацию результата вызова функции с помощью команды:
myStruct(1).Afield
ans =
1После выполнения этой команды создается временная структура. myStruct(1) больше не существует, и MATLAB возвращает только значение поля. Концептуально такое использование аналогично созданию структуры, индексированию в нее, а затем ее удалению:
S = struct("Afield",1); S.Afield clear S
MATLAB поддерживает индексирование точек в результаты вызова функции, как в foo(arg).prop. Другие формы индексирования в результаты вызова функции (с круглыми скобками, например foo(arg)(2) или с фигурными скобками, такими как foo(arg){2}) не поддерживаются. Успешные команды должны соответствовать следующим критериям:
Функция вызывается в скобках, как в foo(arg1,arg2,...).
Функция возвращает переменную, для которой определено точечное индексирование, например структуру, таблицу или объект.
Допустимый индекс индексирования точек.
MATLAB всегда пытается применить операцию точечного индексирования к временной переменной, даже если функция возвращает переменную, для которой точечное индексирование не определено. Например, при попытке индексировать в матрицу, созданную magic(3)Тогда вы получите ошибку.
magic(3).field
Dot indexing is not supported for variables of this type.
Можно добавить дополнительные команды индексирования в конец выражения, пока временные переменные могут продолжать индексироваться. Например, рассмотрим выражение:
table(rand(10,2)).Var1(3,:)
table(rand(10,2)) создает таблицу с одной переменной с именем Var1. Переменная содержит матрицу 10 на 2.
table(rand(10,2)).Var1 возвращает матрицу 10 на 2, содержащуюся в Var1.
table(rand(10,2)).Var1(3,:) возвращает третью строку в матрице, содержащейся в Var1.