我有一个具有函数句柄的类作为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)
形式,nargin
和nargout
都会返回-1。
有没有人想出一种方便的方法来验证函数句柄作为输入参数?独立于什么样的功能来处理它?</ p>
答案 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
返回您需要的任何详细信息。然后你总是将一个类传递给你将在其中内置信息的函数。然而,这将是缓慢且不方便的。