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

如何编写支持可变数量输出参数的MATLAB匿名函数?

实现支持多输出的内联梯度函数(适配fminunc)

当然可以实现!你提到的用deal写的多输出匿名函数在fminunc带梯度的场景下看似无效,其实是没找到适配fminunc需求的正确内联写法——我们可以利用MATLAB的nargout和varargout这两个内置变量,写出和带function关键字定义的函数完全等效的内联版本。

核心实现代码

直接看这个内联函数的写法,它和你定义的myFun功能完全一致:

myFunInline = @(x) varargout(1:nargout) = deal(x.^2, 2*x);

测试验证

  • 当只需要函数值时(单输出调用):
    f = myFunInline(3);
    % 输出 f = 9
    
  • 当需要函数值+梯度时(双输出调用):
    [f,g] = myFunInline(3);
    % 输出 f = 9, g = 6
    

原理说明

  • nargout是MATLAB的内置变量,会自动获取当前函数调用时请求的输出参数个数;
  • varargout(1:nargout)会把deal返回的结果中,前nargout个值分配给对应的输出参数;
  • 这样就实现了和function [f,g] = myFun(x)完全一致的行为:根据调用时的输出需求返回对应数量的结果。

在fminunc中使用

当你需要为fminunc提供带梯度的函数时,只需要设置SpecifyObjectiveGradient为true,然后传入这个内联函数即可:

x0 = 1; % 初始值
opt = optimset('SpecifyObjectiveGradient', true);
[xOpt, fOpt] = fminunc(myFunInline, x0, opt);

此时fminunc会以双输出的方式调用myFunInline,正确获取函数值和梯度。

内容的提问来源于stack exchange,提问作者flawr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:13:10