0

Отказ от ответственности: Я фактически использую Scilab, но он в основном очень похож на MATLAB, и, основываясь на моих исследованиях, похоже, что такое же явление происходит с MATLAB.Что именно возвращает функция мультивыхода в Matlab?

В MATLAB функции могут быть мультивыступающими. Предположим, что у нас есть функция function [a, b] = f(x). Если я печатаю:

c = f(x) 

Тогда c присваивается значение первого выхода. Если я типа:

[a, b] = f(x) 

Тогда [a, b] задается значение пары обоих выходов. Это, по-видимому, означает, что MATLAB не имеет referential transparency. Каково фактическое значение выражения f(x)? Что происходит?

+1

Да, Matlab не является ссылочным прозрачным. В противном случае вы можете проиндексировать результат функции. Я думаю, что это упростить программирование, потому что некоторые функции имеют «менее важные» вещи как 2-й и 3-й выпуск. –

ответ

4

В некоторых случаях количество требуемых выходов изменяет поведение, особенно когда функция вызывается без выходных аргументов.

Например, это просто участки гистограммы данных в a с настройками по умолчанию:

hist(a); 

На следующем возвращает данные гистограммы в N. Нет сюжета не получается:

N = hist(a); 

Однако, если мы просим двух выходов (X теперь БИН центры) можно построить гистограмму с bar (что hist использует внутренне, чтобы построить, если нет выходных аргументов не дано):

[N, X] = hist(a); 
bar(X,N); 

Такое поведение контролируется путем проверки nargout, и могут быть включены в ваши собственные функции.

+0

Это имеет смысл! Просто прокомментировал это на другом решении. – Divakar

+0

В первом случае у нас есть 'nargout = 0', второй' nargout = 1' и третий 'nargout = 2'? –

+0

@JackM Да, это правильно. – am304

4

Это означает, что функция f(x) обычно возвращает 2 выхода. Однако при вызове только с одним выходным аргументом он возвращает только первый (a в вашем случае). В MATLAB, вы можете также указать, что вы не заинтересованы в той или иной продукции, используя ~:

[~,b] = f(x); 
[a,~] = f(x); % equivalent to a = f(x) 
+0

Итак, в основном в Matlab вы не «вызываете функцию», вы «вызываете функцию для определенного набора выходов»? –

+0

Ну, это семантика. В MATLAB вы «вызываете функцию», которая возвращает один или несколько выходов (или иногда нет, в зависимости от функции). Вы можете использовать 'nargout' в теле функции, чтобы определить, сколько аргументов вывода вызывается и что возвращать. См. Http://www.mathworks.co.uk/help/matlab/matlab_prog/find-number-of-function-arguments.html. – am304

+1

Ну, первый вывод не всегда эквивалентен единственному выходному случаю. Например, когда вы используете 'idx = find()', 'idx' даст вам линейный индекс. Но если вы это сделаете - '[idx, ~] = find()', 'idx' будет индексом строки. Большинство встроенных функций MATLAB используют 'nargout' (о котором вы только что упоминали) для обнаружения и, соответственно, выходных значений. 'nargout' будет' 2' с обоими из них - '[a, b] = some_func1' и' [a, ~] = some_func1', и это то, что я думаю, что MATLAB использует, чтобы решить, что выводить. – Divakar

Смежные вопросы