如何编写支持可变数量输出参数的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
相关产品推荐
相关产品推荐

