Проверка того, как функция была вызвана в MATLAB - PullRequest
0 голосов
/ 30 апреля 2020

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

Допустим, у меня есть function y = fun(a,b). Из того, что я понял, в зависимости от того, нужно ли пользователю значение y, оно ЛИБО вычислит y ИЛИ нарисует какую-то диаграмму.

Так что я думаю, что это означает, что если пользователь вызывает мою функцию следующим образом: z = fun(1,2), затем он вычисляет y и возвращает его, но если он называет это так: fun(3,4);, то он ничего не возвращает и вместо этого рисует диаграмму.

Есть ли какие-либо способ проверить, как внутри него вызывается моя функция? Если да, то как?

Ответы [ 2 ]

2 голосов
/ 30 апреля 2020

Вы можете использовать nargout здесь:

function y = q61527462(a,b)
    if nargout > 0
        % Calculate y
        y = a + b;
    else
        % Plot
        plot(a,b)
    end
end

, поэтому при вызове функции:

>> y = q61527462(1,2)

вы получите:

y =

     3

и когда вы звоните с:

>> q61527462(1,2)

, вы получаете сюжет

1 голос
/ 30 апреля 2020

Посмотрите на nargout, что примерно соответствует номеру аргумента для вывода (также есть nargin для проверки числа входных аргументов).

Однако функция все равно вернет возвращаемое значение, если вы просто проверите для nargin. Вам также нужно будет использовать varargout ( вывод аргумента переменной ), чтобы ваша функция возвращала что-то, только если вывод будет присвоен какой-либо внешней переменной.

Таким образом, вы просто пишете в своей функции

function varargout = fun()

if nargout % implicit cast to a logical. It is equivalent to nargout > 0
    % return output
    varargout{1} = true; % note that this requires to wrap your output in a cell
else
    % do plotting
end

РЕДАКТИРОВАТЬ: Даже нет необходимости использовать varargout. Если вы не присвоите значение возвращаемой переменной, оно не появится. Таким образом, MATLAB может управлять неназначенной возвращаемой переменной (чему я сам удивился, узнав ^^). Это даже работает с несколькими выходами!

...