如何验证函数句柄作为输入参数?

时间:2013-09-25 19:48:03

标签: matlab oop validation matlab-class function-handle

我有一个具有函数句柄的类作为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等内置函数,但如果我尝试输入像f = @(x) x^(0.5)这样的匿名函数,那么nargout(hfun)为-1,因为它将匿名函数视为[varargout] = f(x)。此外,如果您将句柄输入到f = @obj.methodFun等类方法,则会将该函数转换为[varargout] = f(varargin)形式,narginnargout都会返回-1。

有没有人想出一种方便的方法来验证函数句柄作为输入参数?独立于什么样的功能来处理它?<​​/ p>

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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返回您需要的任何详细信息。然后你总是将一个类传递给你将在其中内置信息的函数。然而,这将是缓慢且不方便的。