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, 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/v6.4.0/Multiple-Return-Values.html