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 для получения только некоторых возвращаемых значений или нескольких сразу в массиве ячеек. См. Массивы ячеек.
- : nthargout (n, func, …) ¶
- : nthargout (n, ntot, func, …) ¶
-
Возвращает n-й аргумент вывода функции, указанной с помощью указателя на функцию или строки func.
Любые дополнительные аргументы передаются непосредственно в func. Общее количество аргументов, с которым вызывать func, может быть передано в 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 и lu — это примеры встроенных функций, которые ведут себя по-разному в зависимости от значения nargout.
Можно написать функции, которые устанавливают только некоторые возвращаемые значения. Например, вызов функции
function [x, y, z] = f () x = 1; z = 2; endfunction
как
[a, b, c] = f ()
производит:
a = 1 b = [](0x0) c = 2
вместе с предупреждением.
- : nargout () ¶
- : 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–2022 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/v7.2.0/Multiple-Return-Values.html