Matlab中nargout返回-1的原因及获取函数正确输出数的方案
nargout返回-1的原因 Matlab官方对nargout的返回规则明确说明:当查询的函数句柄是匿名函数时,nargout固定返回-1。
匿名函数本身没有显式的输出参数声明语法,它的输出数量完全由内部表达式的返回结果决定,Matlab不会在静态解析阶段递归推导匿名函数内部表达式的输出个数,因此直接返回-1表示该函数的输出数量不确定。你示例中的匿名函数fun虽然实际调用了双输出的helper_fun,但nargout并不会解析内部调用逻辑,因此返回-1。
提取正确输出变量数量的替代方法
- 方法1:显式封装为普通/嵌套函数替代匿名函数
如果你可以控制传入的函数句柄实现,直接将匿名函数替换为带明确输出声明的嵌套函数即可让nargout正常识别:
function test % 替换原匿名函数为嵌套函数,显式声明输出参数 function [x,y] = fun(a) [x,y] = helper_fun(a,2); end nargout(@fun) % 此处将返回正确值2 end function [c,d] = helper_fun(a,b) c=a; d=b; end
该方案改造成本最低,适合输入函数由你侧实现的场景。
- 方法2:试探式调用获取最大输出数
如果无法修改传入的匿名函数实现,可以编写通用工具函数,通过try-catch试探实际可返回的最大输出数:
function max_out = get_actual_nargout(fun, varargin) max_out = 0; while true out_buf = cell(1, max_out + 1); try [out_buf{:}] = fun(varargin{:}); max_out = max_out + 1; catch break; end end end
调用时传入符合函数要求的测试输入即可得到正确输出数:
fun=@(a)helper_fun(a,2); get_actual_nargout(fun, 1) % 返回2
该方案通用性最强,无需修改原有函数实现,仅需要提供合法的输入测试用例即可,注意如果被测函数有运行副作用,需提前做隔离处理。
- 方法3:解析匿名函数元信息递归查询
对于结构简单的匿名函数,可以通过functions函数获取匿名函数的元信息,解析内部调用的底层函数后再查询其输出数:
fun=@(a)helper_fun(a,2); fun_info = functions(fun); % 解析表达式提取调用的函数名helper_fun,再调用nargout查询 nargout(fun_info.workspace{1}.helper_fun) % 返回2
该方案仅适合内部仅调用单个固定函数的简单匿名函数,复杂表达式场景解析成本较高,容错性较低。
内容的提问来源于stack exchange,提问作者Argyll
相关产品推荐
相关产品推荐

