OP’s solution很好,因为它在很多情况下都很简洁实用.
然而,它有一个主要的缺点,因为它的可扩展性低于其他可能的.之所以提出这个主张,是因为所有函数({x ^ 2,2 * x,2})都被评估,无论它们是否需要作为输出 – 这导致“浪费”计算时间和小于3时的内存消耗请求输出.
在这个问题的例子中,这不是问题,因为函数及其派生非常容易计算,输入x是标量,但在不同的情况下,这可能是一个非常现实的问题.
我正在提供一个修改版本,虽然更加丑陋但是避免了上述问题并且更为一般:
funcs_to_apply = {@(x)x.^2, @(x)2*x, @(x)2};
unpacker = @(x)deal(x{:});
myFun = @(x)unpacker(cellfun(@(c)feval(c,x),...
funcs_to_apply(1:evalin('caller','nargout')),...
'UniformOutput',false)...
);
笔记:
>我使用的附加功能是cellfun,evalin和feval.
>只添加了’UniformOutput’参数,以便cellfun的输出是一个单元格(并且可以“解包”到comma-separated list;我们可以将它包装在num2cell中).> evalin技巧是必需的,因为在myFun范围内,我们不知道从解包器请求了多少输出.>虽然通常不鼓励使用各种形式的eval(例如:evalin),但在这种情况下,我们确切地知道调用者是谁,这是一个安全的操作.