在Matlab中嵌套多个函数

在Matlab中嵌套多个函数,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 ,'MaxIt

我在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:简单的方法

我们创建一个封装函数值的匿名函数。你的内在功能变成:

函数内部=obj(系数Pεsim)
comp1=总和(P.*(系数)。);
comp2=平均值(最大值(εsim+[coeff.'0],[2]);
内部=-(comp1-comp2);
结束
这样,它使用的所有值都作为参数传递到函数中,然后我们创建一个匿名函数,其中一个参数使用其所有参数调用
obj

@(x)obj(x,P,εsim)
其用途如下:

[~,fval_temp,exitflag_temp]=fminunc(@(x)obj(x,P,epsilon_sim),系数,选项);
2:更模糊的方式

我说的更模糊是因为这种方法更难看到变量发生了什么

在这里,我们创建一个函数,它与嵌套在其中的函数共享变量。嵌套函数在另一个函数中定义,并且仅对该函数可见:

函数conv\u conjugate=G\u星(P,数字\u开始,选项,u\u开始,εsim)
fval=NaN(开始时的数量,1);
exitflag=NaN(启动次数,1);
对于t=1:启动次数
系数=u_开始(t,:).;%起始值,列向量
[~,fval\u temp,exitflag\u temp]=fminunc(@obj,coeff,options);
fval(t)=fval_温度;
exitflag(t)=exitflag_温度;
结束
fval(exitflag>0,:);
conv_共轭=-min(fval);
%嵌套函数:
内部功能=obj(系数)
comp1=总和(P.*(系数)。);
comp2=平均值(最大值(εsim+[coeff.'0],[2]);
内部=-(comp1-comp2);
结束
end%注意:此“end”终止封闭函数,并且是必需的。

在嵌套函数中,
p
epsilon\u sim
与封闭函数共享。

如果它们是嵌套函数,则内部函数将在外部函数中定义,并可以访问其变量。目前看来,
obj
是一个使用未定义变量的独立函数。因为您捕获所有错误并忽略它们,所以您可能没有注意到这一点。谢谢
obj
在计算
com1
时使用
P
,com1是
G_star
的参数之一。我不知道如何通过
obj
传递
P