matlab - 在 Matlab 中嵌套多个函数
问题描述
我在 Matlab 中有两个嵌套函数。外部使用fminunc
,我希望您帮助如何正确传递一些参数。这是我的代码
clear
rng default
%Some useful parameters
number_starting=10^3;
r=10^5;
J=2;
epsilon_sim=-evrnd(0,1,r,J+1); %rx(J+1)
options = optimoptions(@fminunc, 'MaxFunctionEvaluations', 10^4 ,'MaxIterations', 10^4, 'StepTolerance', 10^(-8), 'Display', 'off');
u_starting=normrnd(0,1,number_starting,J); %rxJ
这是使用的外部功能fminunc
function conv_conjugate=G_star(P, number_starting, options, u_starting,epsilon_sim)
fval=NaN(number_starting,1);
exitflag=NaN(number_starting,1);
for t=1:number_starting
try
coeff=u_starting(t,:).'; %starting values, column vector
[~,fval_temp,exitflag_temp]=fminunc(@obj,coeff, options);
fval(t)=fval_temp;
exitflag(t)=exitflag_temp;
catch
end
end
fval(exitflag>0,:);
conv_conjugate=-min(fval);
end
这是内部函数
function inner=obj(coeff)
comp1=sum(P.*(coeff.'));
comp2=mean(max(epsilon_sim+[coeff.' 0],[],2));
inner=-(comp1-comp2);
end
例如,在这里我尝试在给定的情况下评估外部函数,P
它显然给了我一个错误,因为某些参数没有正确传递obj
。你能建议吗?
P_0=[0.7387,0.1562];
G_star(P_0, number_starting, options, u_starting,epsilon_sim);
解决方案
有两种不同的方法可以实现这一点。
1:简单的方法
我们创建一个封装函数值的匿名函数。您的内部功能变为:
function inner=obj(coeff,P,epsilon_sim)
comp1 = sum(P.*(coeff.'));
comp2 = mean(max(epsilon_sim+[coeff.' 0],[],2));
inner = -(comp1-comp2);
end
这样它使用的所有值都作为参数传递给它,然后我们创建一个带有一个参数的匿名函数,该函数使用它obj
的所有参数调用:
@(x)obj(x,P,epsilon_sim)
用法如下:
[~,fval_temp,exitflag_temp] = fminunc(@(x)obj(x,P,epsilon_sim),coeff, options);
2:更晦涩的方式
我说的比较晦涩,因为这种方法更难看出变量发生了什么。
在这里,我们创建了一个嵌套函数,它与嵌套它的函数共享变量。嵌套函数定义在另一个函数内部,并且只对该函数可见:
function conv_conjugate = G_star(P,number_starting,options,u_starting,epsilon_sim)
fval = NaN(number_starting,1);
exitflag = NaN(number_starting,1);
for t = 1:number_starting
coeff = u_starting(t,:).'; %starting values, column vector
[~,fval_temp,exitflag_temp] = fminunc(@obj,coeff, options);
fval(t) = fval_temp;
exitflag(t) = exitflag_temp;
end
fval(exitflag>0,:);
conv_conjugate = -min(fval);
% Nested function:
function inner=obj(coeff)
comp1 = sum(P.*(coeff.'));
comp2 = mean(max(epsilon_sim+[coeff.' 0],[],2));
inner = -(comp1-comp2);
end
end % Note this "end" terminates the enclosing function, and is mandatory.
在嵌套函数中,P
并epsilon_sim
与封闭函数共享。
推荐阅读
- json - 用于分层 JSON 的 T-SQL
- java - JanusGraph 图片在查询超时后停止响应,如何防止?
- r - R按行子集二维数组,包含特定值
- python - 检查字典值时 if 语句在循环中的位置
- python - 在 mmap_mode 中 Numpy 加载 *.npz 文件的一部分
- android - Android:在后台获取gps位置
- c++ - 将类类型作为构造函数参数传递 C++
- python - 即使我没有相关数据,如何增加概率密度图中 x 轴的范围?
- python - 使用 Scrapy 通过正则表达式提取脚本数据
- reactjs - React Material UI 隐藏表格列并显示 onAdd