如何在Matlab中将两个非嵌套命名函数整合为单个匿名函数?
问题描述
我想把两个非嵌套的命名函数包含到一个匿名函数中,现有代码如下(mainFunction.m文件):
function varargout = mainFunction(in1) % in1 is always a cell %% based on what in1 is, output a function using usefulFunction1UsuallyAFile() varargout{1}=@(x)usefulFunction1UsuallyAFile(in1{1},x); %% something else that I'd like to make into the anonymous function %if numel(in1)>1 % mainFunction(in1{2:end}); %end % I need the call of mainFunction(in1{2:end}) to be preferably always grouped with the call of varargout{1} %% main body of mainFunction() % abbreviated: doing something with varargout{1}(...) (one time) %%%% end function out = usefulFunction1UsuallyAFile(in1,in2) out ={in1,in2}; end
我目前的解决方案是将原有代码:
varargout{1}=@(x)usefulFunction1UsuallyAFile(in1,x);
替换为:
varargout{1}=@(x){usefulFunction1UsuallyAFile(in1{1},x),... mainFunction(in1{2:end})};
但这个方案有很多限制:需要修改所有调用者和输出使用者来解包结果,还要专门处理in1为空的情况,而且调用者只能访问mainFunction(in1{1})的输出。
请问有没有限制更少的方法,比如用更通用的语法或函数把两个函数合并成一个匿名函数?
解决方案
方法1:返回结构化结果的匿名函数
让匿名函数执行两个操作后返回结构体,既保留原有调用逻辑,又能按需获取两个结果:
varargout{1} = @(x) ... struct(... 'primary', usefulFunction1UsuallyAFile(in1{1}, x), ... 'recursive', numel(in1)>1 ? mainFunction(in1{2:end}) : [] ... );
调用示例:
func = mainFunction(myCellArray); result = func(inputX); % 原有逻辑不变,只取主结果 primaryResult = result.primary; % 需要递归结果时再访问对应字段 recursiveResult = result.recursive;
这种方式无需修改原有调用代码,仅在需要递归结果的地方添加字段访问即可。
方法2:封装辅助函数实现多输出兼容
在mainFunction.m中新增一个辅助函数,封装两个操作的逻辑,再返回该函数的句柄:
function varargout = mainFunction(in1) % 原有代码... varargout{1} = @(x) combinedOps(x, in1); % 新增辅助函数 function [primary, recursive] = combinedOps(x, in1) primary = usefulFunction1UsuallyAFile(in1{1}, x); recursive = numel(in1)>1 ? mainFunction(in1{2:end}) : []; end % 原有usefulFunction1UsuallyAFile函数... end
调用时完全兼容原有逻辑,需要递归结果时只需多接收一个输出:
% 原有调用方式,仅获取主结果 func = mainFunction(myCellArray); primaryResult = func(inputX); % 需要递归结果时,使用多输出接收 [primaryResult, recursiveResult] = func(inputX);
这个方案完全不需要修改现有调用者,是兼容性最好的方式。
方法3:利用逗号表达式执行副作用(仅适用于无需递归结果的场景)
如果递归调用只是执行操作、不需要返回结果,可以让匿名函数先执行递归调用,再返回主结果:
varargout{1} = @(x) ... (numel(in1)>1 && mainFunction(in1{2:end}), usefulFunction1UsuallyAFile(in1{1}, x));
这里MATLAB会先执行逗号前的递归调用(作为副作用),再返回主结果,原有调用逻辑完全不受影响,但无法获取递归调用的结果。
内容的提问来源于stack exchange,提问作者Argyll
相关产品推荐
相关产品推荐

