You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 12:43:16