3

関数ハンドルをその の 1 つとして持つクラスがありますproperties

classdef MyClass
    properties
        hfun %function handle 
    end

    methods
        function obj = Myclass(hfun,...)
            %PROBLEM: validate that the input argument hfun is the right kind of function
            if ~isa(hfun,'function_handle') || nargin(hfun)~=1 || nargout(hfun)~=1
                error('hfun must be a function handle with 1 input and 1 output');
            end
            obj.hfun = hfun;
        end
    end
end

hfun入力引数が 1 つの入力と 1 つの出力を持つ関数ハンドルであることを確認したいのですが、それ以外の場合はエラーになります。さらに具体的に言えば、この関数が Nx3 配列を入力引数として取り、出力引数として Nx3 配列を返すようにしたいと思います。

上記のコードは のような組み込み関数に対して機能しますが、f = @sqrtのような無名関数を入れようとすると、無名関数を として扱うため -1 になります。さらに、 のようなクラス メソッドにハンドルを入力すると、との両方に対して -1 を返す形式に関数が変換されます。f = @(x) x^(0.5)nargout(hfun)[varargout] = f(x)f = @obj.methodFun[varargout] = f(varargin)narginnargout

関数ハンドルを入力引数として検証する便利な方法を見つけた人はいますか? どのような種類の関数ハンドルから独立していますか?

4

2 に答える 2

2

関数ハンドルの入力と出力の検証に最も近いのは、try/catch ステートメント内です。

function bool = validateFunctionHandle(fn)
    %pass an example input into the function
    in = blahBlah; %exampleInput
    try
        out = fn(in);
    catch err
        err
        bool = false;
        return;
    end

    %check the output argument
    if size(out)==correctSize and class(out)==correctType
        bool=true;
    else
        bool=false;
    end
end
于 2013-09-26T02:51:05.727 に答える
1

を使用classして、変数が関数ハンドルであるかどうかを判断できますが、MATLAB は型付けが緩く、コマンドを解釈する方法を理解できる限り、変数には何でも含めることができるため、入力と出力の型を検証する簡単な方法はありません。ランタイム。Mohsen が指摘したように、関数を使ってより多くの情報を取得することもできますが、あまり役に立ちません。

これがあなたが得ることができると私が思う最も近いものです:

fn = @(x,y) x + x*2

if strcmpi(class(fn), 'function_handle')
    functionInfo = functions(fn)
    numInputs =  nargin(fn)
    numOutputs = nargout(fn)
end

速度が問題にならない場合は、関数runを実行し、geInfo必要な詳細を返すメンバー関数を持つクラスを作成できます。次に、情報が組み込まれたクラスを常に関数に渡します。ただし、これは遅くて不便です。

于 2013-09-25T21:21:18.897 に答える