2016-11-15 5 views
2

С анонимной функцией вы можете вернуть любое количество выходов. Мне нужно, чтобы иметь возможность использовать функторы (анонимные функции как аргументы других функций), не зная, сколько выходов я получу.Функции функций Matlab и переменное и неизвестное количество выходов

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

Пример:

function y = foo(x) 
    y = x; 
end 

function [y1, y2] = goo(x1, x2) 
    y1 = x1; 
    y2 = x2; 
end 

function [ varargout ] = yolo(functor, varargin) 
    varargout = functor(varargin{:});  
end 

Я хочу, чтобы быть в состоянии назвать:

y = yolo(@foo, 2) 
[y1, y2] = yolo(@goo, 3, 4); 

Есть ли способ для достижения этой цели? Благодаря

ответ

3

Это не представляется возможным получить число выходов анонимной функции (функция дескриптор встроенной функции), потому что выход всегда varargout и поэтому nargout всегда будет возвращать -1

myfunc = @(x, y) x + y; 
nargout(myfunc) 
% -1 

Тем не менее, похоже, что у вас нет анонимных функций, а скорее как дескрипторы функций для обычных функций, которые определены в файле .m и имеют явное количество выходных аргументов. В этом случае вы можете комбинировать nargout с индексом {:}, чтобы заполнить varargout со всеми выходными аргументами.

function y = foo(x) 
    y = x; 
end 

function [y1, y2] = goo(x1, x2) 
    y1 = x1; 
    y2 = x2; 
end 

function varargout = yolo(functor, varargin) 
    [varargout{1:nargout(functor)}] = functor(varargin{:}); 
end 

y = yolo(@foo, 2) 
[y1, y2] = yolo(@goo, 3, 4) 
+0

Спасибо за ваш ответ. Я пытался найти обходное решение, используя количество выходов в качестве аргумента, но похоже, что это сработает, и сейчас это будет проверено. Я не знал, что могу использовать nargout как функцию – Zangdar