使用给定数量的输入参数创建函数
Create function with given number of input arguments
情况如下:
我需要创建一个函数,该函数采用 CONSTANT 输入长度(即 nargin(fun)>=0
)的函数句柄 fun
,对输入进行一些转换,然后然后调用 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
),因此是一个变量-input-length 函数不可接受("easy" 解决方案)。
这个转换是用许多函数调用的,每个函数都有可能的参数数量(n
是无界的),所以覆盖有限数量的可能性也是不可能的。
有没有(简单的?)方法可以做到这一点?
[我在互联网上搜索了几个小时,只能想出一个涉及已弃用的 inline
函数的令人讨厌的黑客攻击,我无法实现;也许我用错了术语。
所以通常你可以使用 varargin
来处理这种事情,但是因为你需要 nargin(g)
到 return actual 数字输入有点棘手。
您可以使用 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);
基于上面的暴行,可能值得考虑一种处理函数句柄的替代方法。
情况如下:
我需要创建一个函数,该函数采用 CONSTANT 输入长度(即 nargin(fun)>=0
)的函数句柄 fun
,对输入进行一些转换,然后然后调用 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
),因此是一个变量-input-length 函数不可接受("easy" 解决方案)。
这个转换是用许多函数调用的,每个函数都有可能的参数数量(n
是无界的),所以覆盖有限数量的可能性也是不可能的。
有没有(简单的?)方法可以做到这一点?
[我在互联网上搜索了几个小时,只能想出一个涉及已弃用的 inline
函数的令人讨厌的黑客攻击,我无法实现;也许我用错了术语。
所以通常你可以使用 varargin
来处理这种事情,但是因为你需要 nargin(g)
到 return actual 数字输入有点棘手。
您可以使用 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);
基于上面的暴行,可能值得考虑一种处理函数句柄的替代方法。