3

我有一个类,它有一个函数句柄作为其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)都返回 -1的形式。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 回答