MATLAB优化场景下如何定义适配任意变量数函数的g匿名函数
解决MATLAB中多变量函数的向量输入调用问题
你的核心需求是将向量形式的输入转换为多变量函数所需的单独参数,同时适配任意维度的函数,正确构造用于fminsearch的标量函数g。以下是两种可行的解决方案:
方案1:利用feval构造辅助匿名函数
修正你之前的辅助函数写法,借助feval实现参数展开:
% 给定f、向量y和第i个标准基向量ei eval_f = @(fun, vec) feval(fun, num2cell(vec){:}); g = @(s) eval_f(f, y + s*ei); % 调用fminsearch求解 [lambda, ~] = fminsearch(g, 0); disp(lambda);
原理说明:
num2cell(vec)将向量vec转换为单元格数组(例如[1,2]转为{1,2});num2cell(vec){:}将单元格数组展开为单独参数({1,2}转为1,2);feval(fun, ...)接收展开后的参数,正确调用多变量函数fun。
方案2:编写独立辅助函数文件
如果匿名函数语法限制让你困惑,可编写名为eval_vectorized.m的辅助函数:
function val = eval_vectorized(fun, vec) % 将向量转为单独参数,调用多变量函数 val = fun(num2cell(vec){:}); end
主代码中调用方式:
g = @(s) eval_vectorized(f, y + s*ei); [lambda, ~] = fminsearch(g, 0); disp(lambda);
验证示例
以多变量函数f(x,y) = x + y测试:
f = @(x,y) x + y; y = [1, 2]; ei = [1, 0]; % 第一个标准基向量 g = @(s) feval(f, num2cell(y + s*ei){:}); [lambda, ~] = fminsearch(g, 0); disp(lambda); % 输出使f(y+s*ei)最小的s值
该方案无需修改代码即可适配任意维度的多变量函数。
内容的提问来源于stack exchange,提问作者Pucho
相关产品推荐
相关产品推荐

