11.4 Несколько возвращаемых значений
В отличие от многих других языков программирования, Octave позволяет определять функции, возвращающие более одного значения. Синтаксис определения функций, возвращающих несколько значений:
function [ret-list] = name (arg-list) body endfunction
где name, arg-list и body имеют то же значение, что и ранее, а ret-list — это список имен переменных, разделенных запятыми, в которых будут храниться значения, возвращаемые функцией. Список возвращаемых значений должен содержать хотя бы один элемент. Если ret-list содержит только один элемент, эта форма оператора 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–2026 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.4.0/Multiple-Return-Values.html