情况如下:
我需要创建一个函数,它接受函数句柄fun
,它是 CONSTANT输入长度(即nargin(fun)>=0
),对输入进行一些转换然后调用{ {1}}。
伪代码:
fun
现在出现问题:输出函数的句柄(function g = transformFun(fun)
n = nargin(fun);
g = @(v_1, ..., v_n) ...
% ^ NOT REAL MATLAB - THE MAIN PROBLEM
fun(someCalculationsWithSameSizeOfOutput(v_1,...v_n){:});
% CAN BE ACHIEVED WITH TEMPORARY CELL IN HELPER FUNCTION ^
end
)然后被传递给其他代码,这些代码依赖于函数长度恒定的事实(假定为g = transformFun(concreteFun)
),因此是变量输入 - 长度功能是不可接受的(“简单”解决方案)。
使用包含每个可能数量的参数的许多函数调用此转换(nargin(g)>=0
是无界的),因此也无法覆盖有限数量的可能性。
是否有(简单的?)方法来实现这一目标?
[我在互联网上搜索了几个小时,只能提出一个令人讨厌的黑客,其中涉及被弃用的n
功能,我无法工作;也许我的术语错误了。
答案 0 :(得分:4)
通常你可以使用varargin
来处理这类事情,但由于你需要nargin(g)
来返回实际的输入数量,所以它有点棘手。
您可以使用str2func
将匿名函数创建为字符串,然后将其转换为函数句柄。
% Create a list or arguments: x1, x2, x3, x4, ...
args = sprintf('x%d,', 1:nargin(func));
args(end) = '';
% Place these arguments into a string which indicates the function call
str = sprintf('@(%s)fun(someCalculationsWithSameSizeOfOutput(%s))', args, args);
% Now create an anonymous function from this string
g = str2func(str);
基于上面的暴露,可能值得考虑一种处理函数句柄的替代方法。