2016-11-15 19 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

関連する問題