11.4 Множественные значения возврата ¶
В отличие от многих других языков программирования, Octave позволяет определять функции, возвращающие более одного значения. Синтаксис определения функций, возвращающих несколько значений, следующий:
function [ret-list] = name (arg-list) body endfunction
где имя, список-аргументов и тело имеют то же значение, что и раньше, а список-возвращаемых-значений — это список переменных, разделенных запятыми, которые будут содержать значения, возвращаемые функцией. Список возвращаемых значений должен содержать по крайней мере один элемент. Если список-возвращаемых-значений содержит только один элемент, эта форма function инструкции эквивалентна форме, описанной в предыдущем разделе.
Вот пример функции, которая возвращает два значения: максимальный элемент вектора и индекс его первого появления в векторе.
function [max, idx] = vmax (v)
idx = 1;
max = v (idx);
for i = 2:length (v)
if (v (i) > max)
max = v (i);
idx = i;
endif
endfor
endfunction В этом конкретном случае два значения могли быть возвращены как элементы одного массива, но это не всегда возможно или удобно. Возвращаемые значения могут иметь несовместимые размеры, и часто желательно присваивать отдельным возвращаемым значениям разные имена.
Возможным способом получения только некоторых возвращаемых значений или нескольких сразу в массиве ячеек является функция nthargout. Смотрите Массивы ячеек.
-
:
arg =nthargout(n, fcn, …)¶ -
:
arg =nthargout(n, ntot, fcn, …)¶ -
Возвращает n-й аргумент вывода функции, заданной функцией-обработчиком или строкой fcn.
Любые дополнительные аргументы передаются напрямую в fcn. Общее количество аргументов для вызова fcn можно передать в ntot; по умолчанию ntot равно n. Входное значение n также может быть вектором индексов вывода, в этом случае вывод будет массивом ячеек с запрошенными аргументами вывода.
Назначение функции
nthargout— избежать промежуточных переменных. Например, при поиске индексов максимального элемента матрицы следующие два составленияnthargoutm = magic (5); cell2mat (nthargout ([1, 2], @ind2sub, size (m), nthargout (2, @max, m(:)))) ⇒ 5 3полностью эквивалентны следующим строкам:
m = magic (5); [~, idx] = max (M(:)); [i, j] = ind2sub (size (m), idx); [i, j] ⇒ 5 3
Также может быть полезно собрать все аргументы вывода в один массив ячеек, как показано в следующем коде:
USV = nthargout ([1:3], @svd, hilb (5));
Помимо установки nargin каждый раз при вызове функции, Octave также автоматически инициализирует nargout количеством ожидаемых возвращаемых значений. Это позволяет создавать функции, которые ведут себя по-разному в зависимости от количества значений, запрошенных пользователем функции. Неявное присваивание встроенной переменной ans не учитывается при подсчёте аргументов вывода, поэтому значение nargout может быть равно нулю.
Функции svd и hist — примеры встроенных функций, которые ведут себя по-разному в зависимости от значения nargout. Например, hist нарисует гистограмму, если вызвана без аргументов вывода, но если вызвана с аргументами вывода, она вернёт частоты и/или центры интервалов без создания графика.
Можно написать функции, которые устанавливают только некоторые возвращаемые значения. Например, вызов функции
function [x, y, z] = f () x = 1; z = 2; endfunction
как
[a, b, c] = f ()
приводит к:
a = 1 b = [](0x0) c = 2
вместе с предупреждением.
-
:
n =nargout()¶ -
:
n =nargout(fcn)¶ -
Сообщает количество аргументов вывода функции.
Вызываемая изнутри функции, возвращает количество значений, которые вызывающая сторона ожидает получить. На верхнем уровне
nargoutбез аргумента не определена и вызовет ошибку.Если вызвана с необязательным аргументом fcn—именем или обработчиком функции—возвращает количество объявленных выходных значений, которые может выдать функция.
Если последним аргументом вывода является varargout, возвращаемое значение отрицательно.
Например,
f ()
вызовет
nargoutвозвращать 0 внутри функцииfи[s, t] = f ()
вызовет
nargoutвозвращать 2 внутри функцииf.Во втором случае,
nargout (@histc) # or nargout ("histc") using a string inputвернёт 2, потому что
histcимеет два выхода, тогда какnargout (@imread)
вернёт -2, потому что
imreadимеет два выхода, а второй — varargout.Примечание по программированию.
nargoutне работает для встроенных функций и возвращает -1 для всех анонимных функций.
© 1996–2023 The Octave Project Developers
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.
https://docs.octave.org/v9.2.0/Multiple-Return-Values.html