Spec-Zone.ru › Octave 7

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 заключается в избегании промежуточных переменных. Например, при поиске индексов максимального значения матрицы следующие две композиции nthargout

m = 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, nargout, varargin, varargout, isargout.

В дополнение к установке 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 для всех анонимных функций.

См. также: nargin, varargout, isargout, nthargout.

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API