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 для получения только некоторых возвращаемых значений или нескольких сразу в массиве ячеек. См. Массивы ячеек.
- : арг = nthargout (n, fcn, …) ¶
- : арг = 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/v8.1.0/Multiple-Return-Values.html